1. Two Sum

如圖,數組內有兩個數字加起來剛好等於target把兩個數字的index有一小ㄧ大的回傳給它。
沒時間解釋了直接暴力遍歷for while, for for 都可以。我也懶得想更好的解法了。
到了解3sum我有時間再慢慢想。
#python3
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
left = 0
# 設定左邊的指針好回傳index
for i in nums:
right = len(nums) - 1
while left < right:
# 當左邊的指針移動到超過右邊就全部遍歷完成,退出。
if target == i + nums[right]:
# 答案只有一組就直接return
return [left, right]
#回圈指針要控制
right -= 1
left += 1
# 題目沒說沒找到要怎辦所以這裡直接隨便return給它
return [-1, -1]
#GO
func twoSum(nums []int, target int) []int {
var right int
for k, v := range nums {
right = len(nums) - 1
for k < right {
if target == v+nums[right] {
return []int{k, right}
} else {
right--
}
}
}
return []int{-1, -1}
}
2. Add Two Numbers

如圖,一個鏈表相加的題目。就跟小學的直式加法有點像只不過他是倒序的。鏈表是一種資料結構。
它是個物件obj用python直接print的話你會看到一串地址。所以當你在用golang的時候要給他一個取地址符。如下
#GO
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
// 先new一個新的鍊表obj,這裡我們用&取地址符。
newChain := &ListNode{}
// 把欲返回鏈表簡短聲明給要準備迭代的鏈表obj
curChain := newChain
// 令一個進位數
carry := 0
// 如果l1 and l2 都有東西的話就進行計算作業直到其中一方沒東西為止
for l1 != nil && l2 != nil{
// 先new一個鏈表接在目前鏈表後面
curChain.Next = &ListNode{}
// 開始計算,進位數給carry,於除數給新鏈表的值。
sumVal := l1.Val + l2.Val + carry
curChain.Next.Val = sumVal % 10
carry = sumVal / 10
// 將目前迭代鏈表跟l1 and l2 鏈表往下個鏈表推進
l1 = l1.Next
l2 = l2.Next
curChain = curChain.Next
}
// 這是l1太長的情況,基本就是重複上面的操作。
for l1 != nil{
curChain.Next = &ListNode{}
sumVal := l1.Val + carry
curChain.Next.Val = sumVal % 10
carry = sumVal / 10
l1 = l1.Next
curChain = curChain.Next
}
// l2太長同理
for l2 != nil{
curChain.Next = &ListNode{}
sumVal := l2.Val + carry
curChain.Next.Val = sumVal % 10
carry = sumVal / 10
l2 = l2.Next
curChain = curChain.Next
}
// 如果carry還有數字的話則要做最後的進位。理論上來說carry應該非0即1
if carry != 0 {
curChain.Next = &ListNode{}
curChain.Next.Val = carry
curChain = curChain.Next
}
// 鏈表的head.Val是沒有用到的所以要把自己做的鏈表去頭才是題目所要的
return newChain.Next
}
#python3
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
c = 0
sumList = ListNode()
sumCur = sumList
curList1 = l1
curList2 = l2
while curList1 is not None and curList2 is not None:
sumCur.next = ListNode()
nodeSum = curList1.val + curList2.val + c
c = nodeSum // 10
sumCur.next.val = nodeSum % 10
curList1 = curList1.next
curList2 = curList2.next
sumCur = sumCur.next
while curList1 is not None:
sumCur.next = ListNode()
nodeSum = curList1.val + c
sumCur.next.val = nodeSum % 10
c = nodeSum // 10
curList1 = curList1.next
sumCur = sumCur.next
while curList2 is not None:
sumCur.next = ListNode()
nodeSum = curList2.val + c
sumCur.next.val = nodeSum % 10
c = nodeSum // 10
curList2 = curList2.next
sumCur = sumCur.next
if c > 0 :
sumCur.next = ListNode(c)
return sumList.next
以上,歡迎討論交流。