1. 程式人生 > 實用技巧 >架構演進

架構演進

1.兩數相加

給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。

您可以假設除了數字 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;

}

}

2. 無重複字元的最長子串

難度中等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)) )

{

occ.add(s.charAt(rk+1));

rk++;

}

ans=Math.max(ans,rk-i+1);

}

return ans;

}

}