水平不高,單純記錄一下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.遞迴函式中位於遞迴呼叫前的語...