【LeetCode】Python之旅 1-2

#因爲是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')
相關文章
相關標籤/搜索