#因爲是starter,參考大神的python解法(http://vimersu.win/blog/2014/03/20/leetcode-solution-02/ 做者: Vimer Su)並另作詳細闡述node
1.Two Sumpython
題意:給定一個target值,若是數組中的兩個數t一、t2相加爲target,返回這兩個數在數組中的下標。(下標從0開始)vim
分析:使用一個字典保存數組的值及其下標(造成鍵值對),遍歷數組nums[],若是字典鍵target-nums[i]的值不存在,則保存其下標;存在則說明t1已經被找到,且目前i指向t2的下標,返回t1的字典值和i便可數組
代碼:app
1 class Solution(object): 2 def twoSum(self, nums, target): 3 dict={} 4 for i in range(len(nums)): 5 if dict.get(target-nums[i],None) == None: 6 dict[nums[i]] = i 7 else: 8 return (dict[target-nums[i]],i) 9 10 p=Solution() 11 nums=[2,7,11,15] 12 target=9 13 p.twoSum(nums,target)
2.Add Two Numbers函數
其實感受這個比上題還簡單一些~測試
題意:例如,一個鏈表保存2->4->3,一個鏈表保存5->6->4,輸出342+564=807即7->0->8,數字都是倒序spa
分析:對位相加,設置進位位,重點在於如何寫單鏈表.net
代碼:code
1 # Definition for singly-linked list. 2 # class ListNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution: 8 # @return a ListNode 9 def addTwoNumbers(self, l1, l2): 10 nHead, flag = ListNode(0), 0 11 head = nHead 12 while flag or l1 or l2: 13 node = ListNode(flag) 14 if l1: 15 node.val += l1.val 16 l1 = l1.next 17 if l2: 18 node.val += l2.val 19 l2 = l2.next 20 flag = node.val // 10 21 node.val %= 10 22 head.next, head = node, node 23 return nHead.next
這題好久才AC,後來問了小若然,原來頭部對於鏈表class的註釋不要刪...否則就會拋出異常(Exception: Type <class '__main__. '>: Not implemented),它這個只是告訴你它的測試平臺就是這麼定義的。而後也並不須要本身寫測試代碼(這可能也是爲何我寫了測試代碼print會打印兩遍的緣由),後臺會自動調用你寫的這個類的(所以也千萬不要改掉它的類名)。對此,小若然表示這很leetcode,就是這樣對新手不友好TAT
2+.第2題的改編,即若是鏈表順序是3->4->2和4->6->5,則須要先將鏈表逆序再相加,才能保證從低位向高位運算,關鍵在於單鏈表逆序的reverse函數,參考http://blog.csdn.net/u011608357/article/details/36933337
代碼:
1 class ListNode(object): 2 def __init__(self, x): 3 self.val = x 4 self.next = None 5 6 7 def reverse(head): 8 if head is None or head.next is None: 9 return head 10 pre = None 11 cur = head 12 h = head 13 while cur: 14 h = cur 15 tmp = cur.next 16 cur.next = pre 17 pre = cur 18 cur = tmp 19 return h 20 21 22 class Solution(object): 23 def addTwoNumbers(self, l1, l2): 24 newl1=reverse(l1) 25 newl2=reverse(l2) 26 nHead, flag = ListNode(0), 0 27 head = nHead 28 while newl1 or newl2 or flag: 29 node = ListNode(flag) 30 if newl1: 31 node.val += newl1.val 32 newl1 = newl1.next 33 if l2: 34 node.val += newl2.val 35 newl2 = newl2.next 36 flag = node.val // 10 37 node.val %= 10 38 head.next, head = node, node 39 newHead = reverse(nHead) 40 print newHead.val 41 print newHead.next.val 42 print newHead.next.next.val 43 44 l1 = ListNode(2) 45 l1.next = ListNode(4) 46 l1.next.next = ListNode(3) 47 l2 = ListNode(5) 48 l2.next = ListNode(6) 49 l2.next.next = ListNode(4) 50 p = Solution() 51 p.addTwoNumbers(l1, l2)
單鏈表逆置:把cur指向當前節點,pre指向前一節點,把cur.next保存到臨時變量tmp,而後cur的next指向pre,而後pre取代如今的cur,cur指向tmp,繼續循環此過程。另外注意h保存頭結點。
今天看到知乎上輪子哥說能夠按照經過率從高到低來作,以爲是個好主意...尤爲對於我這樣的python入門者來講。
344.Reverse String
1 class Solution(object): 2 def reverseString(self, s): 3 """ 4 :type s: str 5 :rtype: str 6 """ 7 length = len(s) 8 s1 = [] 9 for i in range (0,length): 10 s1.append('0') 11 for i in s: 12 s1[length-1] = i 13 length -= 1 14 s1 = ''.join(s1) 15 return s1
這裏主要記住一個,python中字符串和字符串數組的相互轉換方法:
字符串數組轉字符串:['x','y','z'] => 'xyz'
b = ''.join(['x','y','z'])
字符串轉字符串數組:'xyz' => ['x','y','z']
a = list('xyz')