@chanvee
2015-01-21T13:23:25.000000Z
字数 4907
阅读 7427
LeetCode Python
二叉树的先序遍历输出,思想很简单,直接代码了:
# Definition for a binary tree node# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:# @param root, a tree node# @return a list of integersdef preorderTraversal(self, root):result = []return(self.preorderTraversal1(root, result))def preorderTraversal1(self, root, result):if root == None:return(result)result.append(root.val)if root.left:result = self.preorderTraversal1(root.left, result)if root.right:result = self.preorderTraversal1(root.right, result)return(result)
二叉树的后序遍历输出,代码如下:
# Definition for a binary tree node# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:# @param root, a tree node# @return a list of integersdef postorderTraversal(self, root):result = []return(self.postorderTraversal1(root, result))def postorderTraversal1(self, root, result):if root == None:return(result)if root.left:result = self.postorderTraversal1(root.left, result)if root.right:result = self.postorderTraversal1(root.right, result)result.append(root.val)return(result)
二叉树的中序遍历,不再赘述,代码如下:
# Definition for a binary tree node# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:# @param root, a tree node# @return a list of integersdef inorderTraversal(self, root):result = []return(self.inorderTraversal1(root, result))def inorderTraversal1(self, root, result):if root == None:return(result)if root.left:result = self.inorderTraversal1(root.left, result)result.append(root.val)if root.right:result = self.inorderTraversal1(root.right, result)return(result)
判断一个链表是否有循环,思路是我先建一个节点,然后遍历这个链表,每遍历一个节点,就让这个节点指向刚刚新建的那个节点,这样如果有循环,那么它回来之后的next就会指向那个节点,那么就代表有循环。代码如下:
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:# @param head, a ListNode# @return a booleandef hasCycle(self, head):tmp = ListNode(0)result = Falseif head == None:return(result)while head:if head.next == None:return(result)if head.next == tmp:result = Truereturn(result)cur, head.next = head.next, tmphead = cur
与上个题类似,只不过不是判断是否有循环,变为了如果有循环则输出循环开始的位置,这个题就不能向上一个题那样做了,因为上一个题改变了原有的链表的结构,而这个题要返回链表,所有不幸,但思路一致,我们可以把遍历过的节点的值都变为负无穷,如果遇到节点的信息为负无穷,那么这个点就是循环开始的点。代码如下:
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:# @param head, a ListNode# @return a list nodedef detectCycle(self, head):if head == None:return(None)while head:if head.next == None:return(None)if head.val == float("inf"):return(head)head.val = float("inf")head = head.next
求两个链表交叉的节点,思路是如果两个链表等长的话,那么我们只需依次遍历比较这两个链表的节点是否相同即可,所以如果不等长的话,我们将长的链表多出的节点先遍历过,然后再比较即可。代码如下:
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:# @param two ListNodes# @return the intersected ListNodedef getIntersectionNode(self, headA, headB):if headA == None or headB == None:return(None)lenA, lenB = 0, 0curA, curB = headA, headBwhile curA:lenA += 1curA = curA.nextwhile curB:lenB += 1curB = curB.nextif lenA > lenB:for i in range(lenA-lenB):headA = headA.nextif lenA < lenB:for i in range(lenB-lenA):headB = headB.nextwhile headA:if headA == headB:return(headA)headA = headA.nextheadB = headB.nextreturn(None)
给定一个数组列表,输出由这个数组列表中元素组成的最大数。我用的方法比较慢,因为用的是冒泡排序,思路就是比较两个数的“大小”,但是这里不是绝对数值的大小,而是比较两个数拼接起来的大小。代码如下:
class Solution:# @param num, a list of integers# @return a stringdef largestNumber(self, num):if len(num)==0:return ""strAry=[str(item) for item in num]array=self.sorting(strAry)res=''.join(array)if int(res)==0:return '0'else:return resdef sorting(self, strAry):for i in range(len(strAry)-1):for j in range(i+1, len(strAry)):if self.compare(strAry[i], strAry[j]):temp=strAry[i]strAry[i]=strAry[j]strAry[j]=tempreturn strArydef compare(self, s1,s2):return(s1+s2 > s2+s1)
关于Polish Notation的背景介绍,详细见这里。看完之后可以知道我们可以用栈来实现Reverse Polish Notation,也就是遇到数字加入栈,遇到操作符则将出栈两个数来进行操作,并将操作结果加入到栈中。这里需要注意的是关于python的整除,跟C和java不同,python是向下取整的,而C和Java是向零取整,所以对于负数的整除需要特别改一下。代码如下:
class Solution:# @param tokens, a list of string# @return an integerdef evalRPN(self, tokens):tmp = []result = 0for i in range(len(tokens)):if tokens[i] == '+' or tokens[i] == '-' or tokens[i] == '*' or tokens[i] == '/':a = tmp.pop()b = tmp.pop()if tokens[i] == '+':result = b + aif tokens[i] == '-':result = b - aif tokens[i] == '*':result = b * aif tokens[i] == '/':if a*b < 0:result = abs(b) // abs(a)result = -resultelse:result = b // atmp.append(result)else:tmp.append(int(tokens[i]))return(tmp.pop())
求X的平方根,如果不直接用x^2来计算的话,则采用牛顿法。代码如下:
class Solution:# @param x, an integer# @return an integerdef sqrt(self, x):result = x/2.0while abs(result*result - x) > 0.00001:result = (result + x/result) / 2.0return(int(result))
给定整数n和k,输出长度为k的有1到n的组合有多少个。思路是比如说对于k=2到k=3,我们其实相当于在k的基础上加上比第二大但是不大于n的这么多种组合方式,所以可以利用迭代。代码如下:
class Solution:# @return a list of lists of integersdef combine(self, n, k):result = []if k == 1:for i in range(1, n + 1):result.append([i])return(result)result = self.combine(n, k-1)tmp = []for res in result:for i in range(res[-1] + 1, n + 1):tmp.append(res + [i])return(tmp)