1. 程式人生 > 其它 >leetcode 2,4,5 題記錄

leetcode 2,4,5 題記錄

技術標籤:演算法

第二題:兩數之和

先貼程式碼:

 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 }

leetcode每次提交成績都不一樣
思路:
這道題比較簡單,有遞迴和迭代的解法,這裡就記錄一下遞迴解法吧(寫得迭代效率太差就不放了)

  1. 本位計算:因為是逆序,所以直接一個一個雙指標遞推計算就行,兩數相加取模加進位就是該位的最終值
  2. 進位資訊傳遞:如何將進位資訊傳遞到下一位進行計算?我選擇的是直接在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值,以免溢位,雖然不給治直接判斷處理也行,但那樣程式碼就有點臃腫了,所以按照個人喜好,我還是給了值)

  1. 最後將處理後的結果扔進遞迴就行了。
	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
}

其實思路挺簡單的,就不贅述了,拜