讓人頭大的leetcode刷題之旅

2021-10-05 00:08:39 字數 3703 閱讀 9538

水平不高,單純記錄一下leetcode刷題,也督促一下自己。

1.兩數之和

一開始刷leetcode,引數都搞不清楚,摸索了好久才知道怎麼寫。

這裡函式內部的malloc還需要在外部呼叫後釋放。

/**

* note: the returned array must be malloced, assume caller calls free().

*/int

*twosum

(int

* nums,

int numssize,

int target,

int* returnsize)}}

return

null

;}

2.兩數相加

因為做嵌入式的,鍊錶用的不多,搞了半天才寫出來,感覺用的是很笨的辦法。

解題思路:

兩個鍊錶每乙個對應的節點都相加,不管進製。哪個鍊錶的下個節點先指向null,哪個鍊錶短,返回另乙個長的鍊錶。

加完了,判斷長的鍊錶每乙個節點是否需要進製,進製則下一節點val+1,如果是最後乙個節點要進製,則新建乙個節點,這個節點val肯定是1。一開始沒有用p5,新增節點直接是:

p4=p4->next;

p4=new;

搞半天不知道**的問題,還是指標學的不紮實。

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode*

addtwonumbers

(struct listnode* l1,

struct listnode* l2)

if(p1==

null)if

(p4->val>=10)

p4=p4->next;}if

(carry_flag)

else

free

(new)

;return l2;}if

(p2==

null)if

(p3->val>=10)

p3=p3->next;}if

(carry_flag)

else

free

(new)

;return l1;

}return

null

;}

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

破題想了一天。。。

解題思路:head即為子串開始的下標,end為當前待檢測字元下標(與子串比較有沒有和子串內重複)

最後return前的兩個判斷是為了補全兩種情況的應對:如「aaaaa」和「ab」,不加的話輸入「aaaaa」輸出0,輸入「ab」輸出1。

int

lengthoflongestsubstring

(char

* s)

else

else

if(i==end)

else}}

if(len1==

0) len1=1;

if(len1return len1;

}}

5.最長回文子串

解題一倆小時,改堆溢位錯誤一天。。。之前碼**從來沒有注意過堆溢位(主要是陣列邊緣檢測),不過有些溢位檢測實際中沒啥意義,做完頭疼。

思路:所有情況被分為兩種:aa,aba即n和n+1相等或者n和n+2相等,找到後頭下標–,尾下標++,主要注意–和++不能越界。注意一點:s不是字串常量,所以可以直接更改賦值,否則要用malloc。

char

*longestpalindrome

(char

* s)

if(s!=

null

) head=index;

end=head+1;

if(head>

0&&end}}}if

(index+

2<=len-1)

head=index;

end=head+2;

if(head>

0&&end}}

} index++;}

if(maxend-maxheads[maxend+1]

=0;return

(s+maxhead);}

return

null

;}

7.整數反轉

取巧了,單獨把最小負數算做一種情況了。和第九題差不多,都很簡單。

int

reverse

(int x)

while

(x)for

(;len>

1;len--

) x3=x3+x1%10;

if(minus)

return

-x3;

else

return x3;

}

8.字串轉換整數

很簡單,思路略了。

int

myatoi

(char

* str)

else

elseif(

*str==43)

while

(*str)

else

else

}else}}

}else

else

} str++;}

}}if(minus)

else

}else

}

9.回文數

這題很簡單,執行時間和消耗記憶體都beat100%。

bool ispalindrome

(int x)

for(

;len>

1;len--

) x3=x3+x1%10;

if(x3==x2)

return true;

else

return false;

}}

42.接雨水

思路:尋找每個有下降趨勢的陣列下標,然後分為三種情況:

1.該下標後面有比該下表值大的,取第乙個值比它大的下標

2.該下標後面陣列內所有值都比它小,取最大

然後計算。

int

trap

(int

* height,

int heightsize)

else

}else

if(lookfordown)

if(height[end]

>=height[head])}

lookfordown=0;

lookforup=1;

i=end-1;

goto lable;}}

if(lookfordown)

else

for(j=head;j} lookfordown=0;

lookforup=1;

i=end;

goto lable;}}

}return water;

}

發現是不是c語言**記憶體消耗都低?每次都在100%或者98%。

發現同一段**每次執行消耗時間和記憶體都不一樣,可能和輸入的測試資料有關。

待續

讓人頭大的位運算

1.定義 位運算通常是指對二進位制數的運算。常見的位運算子有 1 按位與 全一則一 2 按位或 有一則一 3 按位異或 相同位上不一樣則為1 4 取反,將0變成1,將1變成0.3 左移 m 1是將m轉化成2進製數,向左移動一位丟棄高位,低位補零。左移就相當於乘以2的n次方。eg 將十進位制3左移4位...

leetcode之令人頭大的有限狀態自動機

今日打卡一題是leetcode 8.字串轉換整數 atoi 但從題目看來,感覺挺簡單呀,這不就是語言裡面會自帶的atoi函式嗎?跟傳說中編譯原理中的自動機有什麼關係,做題要不要這麼博學。其實由於將字串轉換成整數的時候限制條件有很多個,流程複雜。所以使用有限狀態自動機可以梳理開始和結束,中間各種條件轉...

讓人頭疼的遞迴演算法

遞迴,一般指函式的定義中使用函式自身的方法。也就是說,遞迴演算法是一種直接或者間接呼叫自身函式方法的演算法。實質上是把問題分解成規模縮小的同類問題的子問題,然後遞迴呼叫方法來表示問題的解。基本原理 1.每一級的函式呼叫都有自己的變數。2.每一次函式呼叫都會有一次返回。3.遞迴函式中位於遞迴呼叫前的語...