@knight
2016-09-09T01:52:55.000000Z
字数 23100
阅读 9332
python
# 依次遍历第一个找到的两个数就是乘积最小的一个# 设置两个指针,初始为第一个low和最后一个hight, low只能加, hight只能减# -*- coding:utf-8 -*-class Solution:def FindNumbersWithSum(self, array, tsum):if not array: # 数组为空返回[]return []low = 0hight = len(array)-1while low < hight:tmp_sum = array[low]+array[hight]if tmp_sum > tsum: # 当前和大于tsum,那么需要减值hight -= 1elif tmp_sum < tsum:low += 1else:return [array[low], array[hight]]return []
# -*- coding:utf-8 -*-class Solution:def FindNumbersWithSum(self, array, tsum):# 和为s的两个数字ret = []for i, num in enumerate(array):tmp = tsum - numif tmp in array[i+1:]:ret.append((num*tmp, num, tmp))if not ret:return rettmp_ret = min(ret) #默认(num*tmp, num, tmp) num*tmp作为关键码求最小return tmp_ret[1:]
考虑两个数small和big分别表示当前最小值和最大值。初始设置为1,2.如果从small到big序列的和大于s,我们可以从序列中去掉较小值,否则增加big值。
# -*- coding:utf-8 -*-class Solution:def FindContinuousSequence(self, tsum):if tsum < 3: # 验证至少2个数return []small, big = 1, 2middle = (1+tsum)>>1 # 最大值--终止条件cur_sum = small + bigret = []while small < middle:if cur_sum == tsum:ret.append(range(small, big+1))while cur_sum > tsum and small < middle: # 当前和大于tsum,减小smallcur_sum -= smallsmall += 1if cur_sum == tsum:ret.append(range(small, big+1))big += 1cur_sum += bigreturn ret
# -*- coding:utf-8 -*-class Solution:def FindGreatestSumOfSubArray(self, array):if not array: # 数组为空返回0return 0dp = [float('-inf')] # 初始值负无穷for i,n in enumerate(array):if dp[i] <= 0: # dp[i]前面最大的连续数组和,如果小于等于0,那么加上当前值只会更小,更新dp[i+1]=ndp.append(n)else:dp.append(dp[i]+n) # 当前值为0,且前面连续最大和为正,说明加上当前数一定大于之前和return max(dp)
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素
B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。
# -*- coding:utf-8 -*-class Solution:def multiply(self, A):first = [1]second = [1]for i in range(1, len(A)):first.append(first[i-1]*A[i-1]) # 依次保存中间的计算值second.append(second[i-1]*A[-i])B = []for i in range(0, len(A)):B.append(first[i]*second[-(i+1)])return B
# -*- coding:utf-8 -*-class Solution:def Add(self, num1, num2):# 使用sum函数return sum([num1, num2])
1) 开始有n个人,从0数到m-1,m-1下标的这个人出列,下一次有n-1个人,从0数到m-1,m-1下标出列,。。下一个出列的下标 = (当前下标 + m-1)%当前人数
# -*- coding:utf-8 -*-class Solution:def LastRemaining_Solution(self, n, m):if n < 1 or m < 1:return -1last = 0people = range(n)i = 0for num in range(n,1,-1):i = (i+m-1)%numpeople.pop(i)return people[-1]
# -*- coding:utf-8 -*-class Solution:def IsContinuous(self, numbers):if not numbers or len(numbers) != 5:return Falsezeros = numbers.count(0)gap = 0i,j = zeros, zeros+1n = len(numbers)numbers.sort()while j < n:if numbers[i]==numbers[j]:return Falsegap += numbers[j] - numbers[i] - 1i = jj += 1return True if gap <= zeros else False# write code here
# -*- coding:utf-8 -*-class Solution:# 返回[a,b] 其中ab是出现一次的两个数字def FindNumsAppearOnce(self, array):ret = []for num in array:if array.count(num)==1:ret.append(num)if len(ret)==2:return retreturn [0,0]# write code here
# -*- coding:utf-8 -*-class Solution:def GetNumberOfK(self, data, k):# o(n)解法,笔试编程题一般没问题,想必面试是过不了的,利用数组有序,做二分查找return data.count(k)# log(n)的解法,二分查找在找到k的时候做变形使得满足要求# -*- coding:utf-8 -*-class Solution:def bisect_first_k(self, data, k, start, end):# 找到第一个kif start > end:return -1mid = (start+end)>>1if data[mid]==k:if mid > 0 and data[mid-1]!=k or mid==0:return midelse:end = mid -1elif data[mid] > k:end = mid - 1else:start = mid + 1return self.bisect_first_k(data, k, start, end)def bisect_last_k(self, data, k, start, end):# 找到最后一个kif start > end:return -1mid = (start+end)>>1if data[mid]==k:if mid < len(data)-1 and data[mid + 1] != k or mid ==len(data)-1:return midelse:start = mid + 1elif data[mid] > k:end = mid - 1else:start = mid + 1return self.bisect_last_k(data, k , start, end)def GetNumberOfK(self, data, k):count = 0if data and len(data)>0:first = self.bisect_first_k(data, k, 0, len(data)-1)last = self.bisect_last_k(data, k, 0, len(data)-1)if first > -1 and last > -1:return last - first + 1return count# write code here
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
class Solution:def GetUglyNumber_Solution(self, index):# write code heren, m = 0, 0k1, k2, k3 = [1], [1], [1]while n < index:m = min(k1[0], k2[0], k3[0])n += 1if m in k1:k1.remove(m)if m in k2:k2.remove(m)if m in k3:k3.remove(m)k1.append(m*2)k2.append(m*3)k3.append(m*5)return m
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
# -*- coding:utf-8 -*-class Solution:def str_cmp(self, s1, s2): # 定义排序比较规则s1, s2 = s1+s2, s2+s1return cmp(s1, s2)def PrintMinNumber(self, numbers):if not numbers:return ''tmp = map(str, numbers) # 转化为strtmp.sort(self.str_cmp)return ''.join(tmp)
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
# -*- coding:utf-8 -*-class Solution:def NumberOf1Between1AndN_Solution(self, n):count = 0for i in range(1,n+1):count += str(i).count('1')return count
# -*- coding:utf-8 -*-import heapqclass Solution:def GetLeastNumbers_Solution(self, tinput, k):if tinput==None or len(tinput)<k:return []return heapq.nsmallest(k, tinput)# write code here
# -*- coding:utf-8 -*-class Solution:def MoreThanHalfNum_Solution(self, numbers):mid = len(numbers)>>1for num in numbers:if numbers.count(num) > mid: # py中的count()使用return numreturn 0
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字
# -*- coding:utf-8 -*-class Solution:# matrix类型为二维列表,需要返回列表def printMatrix(self, matrix):if not matrix:return Nonerows = len(matrix)cols = len(matrix[0])start = 0result = []while rows > 2*start and cols > 2*start:endx = rows - 1 - startendy = cols - 1 - startfor i in range(start, endy+1): # 左到右处理result.append(matrix[start][i])if start < endx: # 上到下处理for i in range(start+1,endx+1):result.append(matrix[i][endy])if start < endx and start < endy: # 右到左处理for i in range(endy-1, start-1, -1):result.append(matrix[endx][i])if start < endx-1 and start < endy: # 下到上处理for i in range(endx-1, start, -1):result.append(matrix[i][start])start += 1return result
# -*- coding:utf-8 -*-# 所有元素都是大于0, 所以零pre=0class Solution:def minNumberInRotateArray(self, rotateArray):if len(rotateArray)==0:return 0pre = 0for num in rotateArray:if num < pre:return numpre = numreturn rotateArray[0]# 有序,输出第一个元素
python处理字符串实在是便利。
实现
.*的匹配
# -*- coding:utf-8 -*-def match_core(s, pat):if len(s)==0 and len(pat)==0: #匹配完成返回Truereturn Trueif len(s)>0 and len(pat)==0: #匹配串pat匹配完,而s不为空,说明不匹配return Falseif len(pat)>1 and pat[1]=='*': # pat至少有2个*匹配才有意义if len(s)>0 and (s[0]==pat[0] or pat[0]=='.'): # ab .* / ab a* 两种情况统一处理return match_core(s[1:], pat) or match_core(s, pat[2:]) or match_core(s[1:], pat[2:]) # *匹配1个保持当前模式/不匹配/移动到下一个状态else: # len(s)==0 s匹配完,看剩下的是否匹配return match_core(s, pat[2:])if len(s)>0 and (pat[0]=='.' or pat[0]==s[0]): # 处理非匹配字符和 . 直接处理下一个return match_core(s[1:], pat[1:])class Solution:# s, pattern都是字符串def match(self, s, pattern):return match_core(s, pattern)# write code here
# -*- coding:utf-8 -*-class Solution:def StrToInt(self, s):if not s:return 0str2num = {'1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '0':0}flag2num = {'-':-1, '+': 1}first = s[0]if first in ['+', '-']: # 包含符号位的情况flag = flag2num[first]tmp = 0for n in s[1:]:if n not in str2num:return 0tmp = tmp*10 + str2num[n]return tmp*flagelse:tmp = 0for n in s:if n not in str2num:return 0tmp = tmp*10 + str2num[n]return tmp
# -*- coding:utf-8 -*-class Solution:def ReverseSentence(self, s):return ' '.join(s.split(' ')[::-1])# write code here
# -*- coding:utf-8 -*-class Solution:def LeftRotateString(self, s, n):return s[n:] + s[:n]# write code here
# -*- coding:utf-8 -*-class Solution:def FirstNotRepeatingChar(self, s):if not s:return -1for i, ch in enumerate(s):if s.count(ch)==1:return i# write code here
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
# -*- coding:utf-8 -*-import itertoolsclass Solution:def Permutation(self, ss):# 借助内置的itertools.permutaions求解# write code hereif not ss:return ssresult = []k = itertools.permutations(ss)for i in k:result.append(''.join(i))result = list(set(result))result.sort()return result# -*- coding:utf-8 -*-def permuations(n):# 全排列的一个实现(二找,一交换,一翻转)"""1. 找到排列中最右一个升序的首位置i, x=ai2. 找到排列中第i位向右最后一个比ai大的位置,j, y=aj3. 交换x y4. 把第i+1位到最后的部分翻转21543--下一个数是23145"""indices = range(n)# n = len(ss)yield indiceswhile True:low_idx = n-1while low_idx > 0 and indices[low_idx-1] > indices[low_idx]: # 找到排列中最右一个升序的首位置low_idx -= 1if low_idx == 0:breaklow_idx -= 1high_idx = low_idx + 1while high_idx < n and indices[high_idx] > indices[low_idx]: #找到排列中第i为向右最右一个比ai大的位置high_idx += 1high_idx -= 1indices[low_idx], indices[high_idx] = indices[high_idx], indices[low_idx] # 交换indices[low_idx+1:] = reversed(indices[low_idx+1:]) # 翻转yield indicesclass Solution:def Permutation(self, ss):if not ss:return []ret_set = set()for idx in permuations(len(ss)):e = ''.join([ss[i] for i in idx])ret_set.add(e)return sorted(ret_set)# write code here
# -*- coding:utf-8 -*-class Solution:# s 源字符串def replaceSpace(self, s):return s.replace(' ', '%20')
# -*- coding:utf-8 -*-class Solution:def IsPopOrder(self, pushV, popV):n = len(pushV)if not n: return Falsetmp = []j = 0for val in pushV:tmp.append(val) # 依次入栈while j < n and tmp[-1]==popV[j]: # tmp栈顶值等于popV[j]值 出栈tmp.pop()j += 1if tmp:return Falsereturn True
定义栈的数据结构,实现一个能够得到栈最小元素的min函数
# -*- coding:utf-8 -*-class Solution:def __init__(self):self.stack = [] # 存放数据self.stack_min = [] # 存放最小值def push(self, node):if not self.stack_min:self.stack_min.append(node)else:if self.min() <= node:self.stack_min.append(self.min())else:self.stack_min.append(node)self.stack.append(node)# write code heredef pop(self):if not self.stack:return []else:self.stack_min.pop()return self.stack.pop()# write code heredef top(self):if not self.stack:return []return self.stack[-1]# write code heredef min(self):if not self.stack_min:return []else:return self.stack_min[-1]# write code here
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:def deleteDuplication(self, pHead):if not pHead or not pHead.next:return pHeadif pHead.next.val==pHead.val:pnode = pHead.next.nextwhile pnode and pnode.val == pHead.val:pnode = pnode.nextreturn self.deleteDuplication(pnode)else:# pnode = pHead.nextpHead.next = self.deleteDuplication(pHead.next)return pHead# write code here
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Nonedef meeting_node(pHead):if not pHead:return Nonepslow = pHead.nextif not pslow:return Nonepfast = pslow.nextwhile pslow and pfast:if pslow==pfast:return pslowpslow = pslow.nextpfast = pfast.next.nextreturn None # 前面没有相遇返回Noneclass Solution:def EntryNodeOfLoop(self, pHead):"""1. 找到环2. 计算环中结点个数3. 根据环结点个数设置快指针初始4. 快慢指针相遇"""pmeet = meeting_node(pHead)if not pmeet:return Nonenode_count = 1 #当前相遇点包含在环中 1pnode = pmeetwhile pnode.next != pmeet: # 遍历一圈计数得到环中结点个数pnode = pnode.nextnode_count += 1pnode1 = pHeadfor i in range(node_count): # pnode1 先走node_countpnode1 = pnode1.nextpnode2 = pHeadwhile pnode2!=pnode1: # pnode2 走node_count步之后指向环的入口pnode2 = pnode2.nextpnode1 = pnode1.nextreturn pnode1# write code here
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Nonedef iter_node(root):while root:yield rootroot = root.nextclass Solution:def FindFirstCommonNode(self, pHead1, pHead2):if not pHead1 or not pHead2:return Nonep1 = [node for node in iter_node(pHead1)]p2 = [node for node in iter_node(pHead2)]ret = Nonewhile p1 and p2:top1 = p1.pop()top2 = p2.pop()if top1.val == top2.val:ret = top1continueelse:breakreturn ret#--------------------# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Nonedef iter_node(root):while root:yield rootroot = root.nextclass Solution:def FindFirstCommonNode(self, pHead1, pHead2):if not pHead1 or not pHead2:return Nonep1 = [node.val for node in iter_node(pHead1)]for node in iter_node(pHead2):if node.val in p1:return nodereturn None
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:def Convert(self, pRootOfTree):# 中序遍历if not pRootOfTree or (not pRootOfTree.left and not pRootOfTree.right): # 只有一个根结点或空时return pRootOfTreeself.Convert(pRootOfTree.left) # 递归处理左子树lt = pRootOfTree.leftif lt:while lt.right:lt = lt.rightpRootOfTree.left, lt.right = lt, pRootOfTree # 修改当前根结点的指针self.Convert(pRootOfTree.right) # 处理右子树rt = pRootOfTree.rightif rt:while rt.left:rt = rt.leftpRootOfTree.right, rt.left = rt, pRootOfTreewhile pRootOfTree.left: # 最左的结点是双链表的第一个结点pRootOfTree = pRootOfTree.leftreturn pRootOfTree# write code here
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
# -*- coding:utf-8 -*-# class RandomListNode:# def __init__(self, x):# self.label = x# self.next = None# self.random = None# 使用生成器来高效访问def iter_node(root):while root:yield rootroot = root.nextclass Solution:# 返回 RandomListNodedef Clone(self, pHead):mem = dict() # 保存对象内存地址与下标的对应关系for i, node in enumerate(iter_node(pHead)):mem[id(node)]=i # id获取对象的内存地址lst = [RandomListNode(node.label) for node in iter_node(pHead)] # 创建lst保存结点值for p, node in zip(iter_node(pHead), lst): # 复制next和random指向if p.next:node.next = lst[mem[id(p.next)]]if p.random:node.random = lst[mem[id(p.random)]]return lst[0] if lst else None
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:# 返回合并后列表def Merge(self, pHead1, pHead2):if not pHead1: # pHead1 为空返回pHead2return pHead2elif not pHead2: # pHead2 为空返回pHead1return pHead1else: # 都不为空,处理第一个元素if pHead1.val <= pHead2.val:p = pHead1pHead1 = pHead1.nextelse:p = pHead2pHead2 = pHead2.nextpnode = pwhile pHead1 and pHead2: # 依次处理两个链表if pHead1.val <= pHead2.val:pnode.next = pHead1pnode = pHead1pHead1 = pHead1.nextelse:pnode.next = pHead2pnode = pHead2pHead2 = pHead2.next#处理剩余结点if pHead1:pnode.next = pHead1if pHead2:pnode.next = pHead2return p
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:# 返回ListNode# 非递归版本def ReverseList(self, pHead):if not pHead or not pHead.next: # 空或者只有一个元素直接返回return pHeadq = Nonep = pHeadwhile p:tmp = p.next #暂存下一个结点p.next = q # 修改当前结点指向q = p # 指向返回链表的第一个元素p = tmp # 访问下一个return q# write code here# 递归版本# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:# 返回ListNodedef ReverseList(self, pHead):if not pHead or not pHead.next:return pHeadelse:pnode = self.ReverseList(pHead.next) # pnode新表头pHead.next.next = pHead # 新表头最后一个结点指向pheadpHead.next = None # phead指向None,修改尾指针return pnode# write code here
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = None# 设置间隔为k的两个指针class Solution:def FindKthToTail(self, head, k):# 链表k可能大于链表长度,此时返回Nonei = 0p = headwhile p and i<k:p = p.nexti += 1if i==k: # k小于等于链表长度,正常处理q = headwhile p:q = q.nextp = p.nextreturn qreturn None# write code here
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Nonefrom collections import dequeclass Solution:# 返回从尾部到头部的列表值序列,例如[1,2,3]def printListFromTailToHead(self, listNode):if not listNode:return []tmp = deque() # 使用队列while listNode:tmp.appendleft(listNode.val)listNode = listNode.nextreturn tmp# write code here
矩阵覆盖类似与斐波拉契数列
# -*- coding:utf-8 -*-class Solution:def rectCover(self, number):a = [0, 1, 2]if number<3:return a[number]for i in xrange(3, number+1):a.append(a[i-1]+a[i-2])return a[number]
动手推导一下:2^(n-1)
# -*- coding:utf-8 -*-class Solution:def jumpFloorII(self, number):return 2**(number-1)
# -*- coding:utf-8 -*-class Solution:def jumpFloor(self, number):a = [0,1,2] # 起步不一样if number<3:return a[number]for i in xrange(3, number+1):a.append(a[i-1]+a[i-2])return a[number]# write code here
# -*- coding:utf-8 -*-# 使用记忆体函数,保存中间值。from functools import wrapsdef memo(func):cache = {}@wraps(func)def wrap(*args):if args not in cache:cache[args] = func(*args)return cache[args]return wrapclass Solution:@memodef Fibonacci(self, n):if n==0:return 0if n<2:return 1return self.Fibonacci(n-1) + self.Fibonacci(n-2)# 使用list缓存中间值class Solution_2:def Fibonacci(self, n):a = [0, 1, 1]if n<3:return a[n]for i in range(3,n+1):a.append(a[i-1]+a[i-2])return a[n]
请实现两个函数,分别用来序列化和反序列化二叉树
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:# 返回二维列表[[1,2],[4,5]]def Print(self, pRoot):if not pRoot:return []nodes = [pRoot]ret = []while nodes:cur, nxt = [], [] # 保存每一层结点for node in nodes:cur.append(node.val)if node.left:nxt.append(node.left)if node.right:nxt.append(node.right)nodes = nxtret.append(cur)return ret# write code here
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:def Print(self, pRoot):if not pRoot:return []nodes = [pRoot]flag = Trueret = []while nodes:cur, nxt = [], [] # 保存每一层的结点for node in nodes:cur.append(node.val)if node.left:nxt.append(node.left)if node.right:nxt.append(node.right)nodes = nxtif flag:ret.append(cur)flag = Falseelse:ret.append(cur[::-1])flag = Truereturn ret# write code here
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:def help_func(self, pRoot1, pRoot2):if not pRoot1 and not pRoot2:return Trueif not pRoot1 or not pRoot2:return Falseif pRoot1.val != pRoot2.val:return Falsereturn self.help_func(pRoot1.left, pRoot2.right) and self.help_func(pRoot1.right, pRoot2.left)def isSymmetrical(self, pRoot):return self.help_func(pRoot, pRoot)# write code here
考察中序遍历
# -*- coding:utf-8 -*-# class TreeLinkNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = None# self.next = None # 指向父节点class Solution:def GetNext(self, pNode):# pnode右子树最左的点或者pnode父节点if not pNode:return Noneelif pNode.right:prt = pNode.rightwhile prt.left:prt = prt.leftreturn prtelif pNode.next:parent = pNode.nextwhile parent and parent.left!=pNode:parent = parent.nextpNode = pNode.nextreturn parent if parent else None# write code here
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:def depth(self, root):if not root:return 0lt = self.depth(root.left)rt = self.depth(root.right)return max(lt, rt) + 1def IsBalanced_Solution(self, pRoot):# 递归解法,出现多次遍历同一个结点的情况if not pRoot:return Truelt = self.depth(pRoot.left)rt = self.depth(pRoot.right)if abs(lt-rt) > 1:return Falsereturn self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right)# write code here
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:def TreeDepth(self, pRoot):# 递归解if not pRoot:return 0return max(self.TreeDepth(pRoot.left), self.TreeDepth(pRoot.right)) + 1# write code here# 非递归解# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:def Depth(self, root):# 层次遍历得到深度if not root:return 0from collections import dequedp = deque()layer = 1dp.append((root,1))while dp:node, layer = dp.popleft()deep = layerif node.left:dp.append((node.left, layer+1))if node.right:dp.append((node.right, layer+1))return deepdef TreeDepth(self, pRoot):return self.Depth(pRoot)
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:# 返回二维列表,内部每个列表表示找到的路径def FindPath(self, root, expectNumber):if not root: # 空树 返回空return []elif root.val > expectNumber: # 当前值大于期望,不存在满足条件路径返回空return []elif root.val == expectNumber and not root.left and not root.right: # 没有左右子树,当前值等于和,那么返回该结点(即叶子结点)return [[root.val]]ret = []if root.left: # 递归处理左子树lt = self.FindPath(root.left, expectNumber - root.val)for i in lt:i.insert(0, root.val)ret.append(i)if root.right: # 递归处理右子树rt = self.FindPath(root.right, expectNumber - root.val)for i in rt:i.insert(0, root.val)ret.append(i)return ret# write code here
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
# -*- coding:utf-8 -*-class Solution:def VerifySquenceOfBST(self, sequence):# 二叉搜索树,左子树值小于根,根小于右子树# 后序遍历,左-右-根# 找到根结点,根据搜索树的特点划分左右子树if not sequence or len(sequence)==0:return Falselenght = len(sequence)root = sequence[-1]breakindex = 0while sequence[breakindex] < root and breakindex < lenght-1:breakindex += 1for i in range(breakindex,lenght):if sequence[i] < root:return Falseleft = Trueif breakindex > 0:left = self.VerifySquenceOfBST(sequence[:breakindex])right = Trueif breakindex < lenght - 1:right = self.VerifySquenceOfBST(sequence[breakindex:lenght-1])return left and right
从上往下打印出二叉树的每个节点,同层节点从左至右打印。层次遍历即可
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Nonefrom collections import dequeclass Solution:# 返回从上到下每个节点值列表,例:[1,2,3]# 使用队列def PrintFromTopToBottom(self, root):if not root:return []node_queue = deque()node_queue.append(root)ret = []while node_queue:first_node = node_queue.popleft() # 队首出队ret.append(first_node.val)if first_node.left:node_queue.append(first_node.left)if first_node.right:node_queue.append(first_node.right)return ret# 使用list# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:# 返回从上到下每个节点值列表,例:[1,2,3]def PrintFromTopToBottom(self, root):if not root:return []node_lst, ret = [root], []while node_lst:ret.append(node_lst[0].val)p = node_lst.pop(0)if p.left:node_lst.append(p.left)if p.right:node_lst.append(p.right)return ret
1) 空树返回空 2)层次遍历入队,栈出队。依次交换当前结点的左右子树
递归处理,交换当前结点左右子树,递归处理左右子树
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:# 返回镜像树的根节点# 非递归解def Mirror(self, root):if not root:return Nonenode_lst = [root]while node_lst:node = node_lst.pop() # 默认弹出最后一个node.left, node.right = node.right, node.leftif node.left:node_lst.append(node.left)if node.right:node_lst.append(node.right)return root# 递归解class Solution:# 返回镜像树的根节点def Mirror(self, root):# root is Noneif not root:return Noneroot.left, root.right = root.right, root.leftself.Mirror(root.left)self.Mirror(root.right)return root
查找与根结点值相等的结点,依次判断左右子树是否包含同样结构
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:def DoesTree1HasTree2(self, pRoot1, pRoot2):if not pRoot2: # pRoot2遍历完,说明包含子结构return Trueif not pRoot1: # pRoot1遍历完,而pRoot2不为空return Falseif pRoot1.val!=pRoot2.val:return Falsereturn self.DoesTree1HasTree2(pRoot1.left, pRoot2.left) and self.DoesTree1HasTree2(pRoot1.right, pRoot2.right) # 递归处理左右子结构def HasSubtree(self, pRoot1, pRoot2):if not pRoot1 or not pRoot2: # 空不是子结构return Falseresult = Falseif pRoot1.val == pRoot2.val: #当前结点值相等,判断是否包含子结构result = self.DoesTree1HasTree2(pRoot1, pRoot2) #if not result: # 遍历左子树result = self.HasSubtree(pRoot1.left, pRoot2) #if not result: # 遍历右子树result = self.HasSubtree(pRoot1.right, pRoot2)return result
# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:# 返回构造的TreeNode根节点def reConstructBinaryTree(self, pre, tin):if not pre or not tin:return Noneroot = TreeNode(pre[0]) # 构造根结点idx = tin.index(pre[0])left = self.reConstructBinaryTree(pre[1:idx+1], tin[:idx]) # 递归处理左子树right = self.reConstructBinaryTree(pre[idx+1:], tin[idx+1:]) # 递归处理右子树if left:root.left = leftif right:root.right = rightreturn root# write code here
# -*- coding:utf-8 -*-class Solution:def Sum_Solution(self, n):# write code here# return (pow(n,2)+n)>>1 利用公式求解# return n and self.Sum_Solution(n-1)+n 利用递归求解,注意终止条件# return sum(range(1,n+1)) 内建公式求解return (pow(n,2)+n)>>1
# -*- coding:utf-8 -*-class Solution:def reOrderArray(self, array):# write code herenum1 = []num2 = []for num in array:if num&0x1==0: # 利用位运算判断奇偶num1.append(num)else:num2.append(num)return num2+num1
指数可能正也可能负
# -*- coding:utf-8 -*-class Solution:def Power(self, base, exponent):if exponent == 0:return 1if exponent == 1:return baseexp = abs(exponent)result = self.Power(base, exp>>1) # 处理exp/2的情况result *= resultif (exp & 0x1 == 1): # 最后一位是1还需要* base 奇数个base的情况result *= baseif exponent > 0:return resultreturn 1/result
# -*- coding:utf-8 -*-class Solution:def NumberOf1(self, n):# 内建bin转换为二进制统计1的个数,注意处理正负号的情况if n==0:return 0if n>0:return bin(n).count('1')else:return bin(n&0xffffffff).count('1')