leetcode 2,4,5 題記錄
阿新 • • 發佈:2021-01-13
技術標籤:演算法
第二題:兩數之和
先貼程式碼:
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil && l2 == nil {return nil}
if l1 == nil {l1 = &ListNode{Val:0,Next:nil}}
if l2 == nil {l2 = &ListNode{Val:0,Next:nil}}
if l1.Val+l2.Val >= 10{
if l1.Next != nil {
l1.Next.Val += 1
}else if l2.Next != nil {
l2.Next.Val += 1
}else{
l1.Next = &ListNode{Val:1,Next:nil}
}
}
l1.Val = (l1.Val+l2.Val)%10
l1.Next = addTwoNumbers(l1.Next,l2.Next)
return l1
}
思路:
這道題比較簡單,有遞迴和迭代的解法,這裡就記錄一下遞迴解法吧(寫得迭代效率太差就不放了)
- 本位計算:因為是逆序,所以直接一個一個雙指標遞推計算就行,兩數相加取模加進位就是該位的最終值
- 進位資訊傳遞:如何將進位資訊傳遞到下一位進行計算?我選擇的是直接在l1或l2的下一位中+1,不過有最後next為空的情況,所以進行了多一步的判斷。
if l1.Val+l2.Val >= 10{
if l1.Next != nil {
l1.Next.Val += 1
}else if l2.Next != nil {
l2.Next.Val += 1
}else{
l1. Next = &ListNode{Val:1,Next:nil}
}
}
(這裡注意:如果l1或l2單獨為空的話,需要給其賦個0值,以免溢位,雖然不給治直接判斷處理也行,但那樣程式碼就有點臃腫了,所以按照個人喜好,我還是給了值)
- 最後將處理後的結果扔進遞迴就行了。
l1.Next = addTwoNumbers(l1.Next,l2.Next)
第四題:
第五題:最長迴文子串
這題著實有點頭痛:因為下意識的去找O(n)以下的解法,想了一晚上沒想出來,這裡就貼O(n)2的吧!!!
func longestPalindrome(s string) string {
if len(s) < 2{
return s
}
maxNum := 0
maxStr := string(s[0])
for i,_ := range s {
str := ""
if i > 1 && s[i-2] == s[i]{
if str = findhw(i-2, i, s);len(str) > maxNum{
maxNum = len(str)
maxStr = str
}
}
if i > 0 && s[i-1] == s[i]{
if str = findhw(i-1, i ,s);len(str) > maxNum{
maxNum = len(str)
maxStr = str
}
}
}
return maxStr
}
func findhw(left int , right int , s string) string {
i := 1
for ; left - i >= 0 && right + i < len(s) ; i++ {
if s[left - i] == s[right + i]{continue}
return s[left - i + 1 : right + i]
}
return s[left - i + 1:right + i]
}
思路
1. 找到切入口,從哪裡開始驗證迴文?準備大致框架
不論多長的迴文串,中點都肯定是aa或者aba的形式,所以以aa或者aba為基本單位向兩邊展開一一比較,maxStr記錄最長字串,maxNum記錄當前最長迴文長度,以便之後的比較。
maxNum := 0
maxStr := string(s[0])
for i,_ := range s {
str := ""
if i > 1 && s[i-2] == s[i]{
}
if i > 0 && s[i-1] == s[i]{
}
}
return maxStr
2. 編寫驗證迴文的方法。
func findhw(left int , right int , s string) string {
i := 1
for ; left - i >= 0 && right + i < len(s) ; i++ {
if s[left - i] == s[right + i]{continue}
return s[left - i + 1 : right + i]
}
return s[left - i + 1:right + i]
}
3. 將驗證迴文方法放入框架,將得到的結果與maxNum對比,更新最大回文串和最大長度
func longestPalindrome(s string) string {
if len(s) < 2{
return s
}
maxNum := 0
maxStr := string(s[0])
for i,_ := range s {
str := ""
if i > 1 && s[i-2] == s[i]{
if str = findhw(i-2, i, s);len(str) > maxNum{
maxNum = len(str)
maxStr = str
}
}
if i > 0 && s[i-1] == s[i]{
if str = findhw(i-1, i ,s);len(str) > maxNum{
maxNum = len(str)
maxStr = str
}
}
}
return maxStr
}
其實思路挺簡單的,就不贅述了,拜