架構演進
給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
我的解法:
C語言
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* p1=l1, p2=l2,s;
struct ListNode* l3=(struct ListNode*)malloc(sizeof(struct ListNode));
s=l3;//初始時尾節點指向頭節點
int tens=0;//進位
while(p1!=NULL&&p2!=NULL)
{
//尾插法
struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->next=NULL;
if(p1->val+p2->val+tens>9)
{
q->val=p1->val+p2->val+tens-10;
tens=1;
s->next=q;
s=q;
}
else
{
q->val=p1->val+p2->val+tens;
tens=0;
s->next=q;
s=q;
}
p1=p1->next,p2=p2->next;
}
if(p1!=NULL)
{
s->next=p1;
}
else
{
s->next=p2;
}
return l3->next;
}
錯誤:忽略了最後一位相加大於10的情況
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* p1=l1, p2=l2,s;
struct ListNode* l3=(struct ListNode*)malloc(sizeof(struct ListNode));
s=l3;//初始時尾節點指向頭節點
int tens=0;//進位
int x,y,sum;
while(p1!=NULL||p2!=NULL)
{
//尾插法
struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->next=NULL;
if(p1==NULL){x=0;}
else{x=p1->val;p1=p1->next;}
if(p2==NULL){y=0;}
else{y=p2->val;p2=p2->next;}
sum=x+y+tens;
if(sum>9) {q->val=sum-10;tens=1;s->next=q;s=q; }
else{ q->val=sum; tens=0;s->next=q;s=q; }
}
if(tens==1)//最後相加多出一位
{
struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->next=NULL;
q->val=1;
s->next=q;
s=q;
}
return l3->next;
}
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead=new ListNode(0);//頭節點不存資料
ListNode RearNode=dummyHead;//初始化尾節點指向頭節點
ListNode p1=l1,p2=l2;
int carry=0;//進位
while(p1!=null || p2!=null)
{
int x=(p1!=null)?p1.val:0;
int y=(p2!=null)?p2.val:0;
int sum =x+y+carry;
//插入節點
if(sum>9){RearNode.next=new ListNode(sum-10);carry=1;}
else{RearNode.next=new ListNode(sum);carry=0;}
RearNode=RearNode.next;
if(p1!=null){p1=p1.next;}
if(p2!=null){p2=p2.next;}
}
if(carry==1){RearNode.next=new ListNode(1);}
return dummyHead.next;
}
}
難度中等4174
給定一個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
class Solution {
public int lengthOfLongestSubstring(String s) {
//採用滑動視窗
Set<Character> occ=new HashSet<Character>();
int ans=0,len=s.length();
int rk=-1;
for(int i=0;i<len;i++)
{
if(i!=0)//左指標向左移動一位,刪除集合中此元素
{
occ.remove(s.charAt(i-1));
}
//右指標一直往右移並將元素加入到集合中,直到出現與集合重複元素
while(rk+1<len && !occ.contains(s.charAt(rk+1)) )
{
rk++;
}
ans=Math.max(ans,rk-i+1);
}
return ans;
}
}