【LeetCode】Python之旅 1-2
#由于是starter,参考大神的python解法(http://vimersu.win/blog/2014/03/20/leetcode-solution-02/ 作者: Vimer Su)并另做详细阐述
1.Two Sum
题意:给定一个target值,如果数组中的两个数t1、t2相加为target,返回这两个数在数组中的下标。(下标从0开始)
分析:使用一个字典保存数组的值及其下标(形成键值对),遍历数组nums[],如果字典键target-nums[i]的值不存在,则保存其下标;存在则说明t1已经被找到,且目前i指向t2的下标,返回t1的字典值和i即可
代码:
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,数字都是倒序
分析:对位相加,设置进位位,重点在于如何写单链表
代码:
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')