在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。# -*- coding:utf-8 -*-class Solution:# array 二维列表def Find(self, target, array):# write code hereif not array:return Falserow = len(array)col = len(array[0])i = 0j = col-1while i < row and j >= 0:if array[i][j] > target:j -= 1elif array[i][j] < target:i += 1else:return Truereturn False
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。class Solution:# s 源字符串def replaceSpace(self, s):# write code here"""s = s.replace(" ", "%20")return s"""# 先统计空格的数量num_space = 0for i in s:if i == " ":num_space += 1l = len(s)replace_s = [None for _ in range(l + 2 * num_space)]i = l-1j = len(replace_s)-1while i >= 0:if s[i] != " ":replace_s[j] = s[i]j -= 1else:replace_s[j] = ‘0‘j -= 1replace_s[j] = ‘2‘j -= 1replace_s[j] = ‘%‘j -= 1i -= 1return "".join(replace_s)
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。class Solution:# 返回从尾部到头部的列表值序列,例如[1,2,3]def printListFromTailToHead(self, listNode):"""# write code here# 采用栈存储数据res = []while listNode:res.insert(0, listNode.val)listNode = listNode.nextreturn res"""‘‘‘# 直接采用递归的方法res = []def add_list(listNode):if not listNode:returnadd_list(listNode.next)res.append(listNode.val)add_list(listNode)return res‘‘‘# 直接采用递归的方法def add_list(listNode, res):if not listNode:return resres = add_list(listNode.next, res)res.append(listNode.val)return resreturn add_list(listNode, [])
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。class Solution:# 返回构造的TreeNode根节点def reConstructBinaryTree(self, pre, tin):# write code hereif len(pre)>0:# 根节点必定在pre的第一个数root = TreeNode(pre[0])# 在中序遍历数列中找到树根节点位置root_id = tin.index(pre[0])# 由于先序遍历的第一个是中序遍历的最后一个(子树中), 所以pre从1开始,tin从root_id-1结束root.left = self.reConstructBinaryTree(pre[1:1+root_id], tin[:root_id])root.right = self.reConstructBinaryTree(pre[1+root_id:], tin[root_id+1:])return root
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。class Solution:def __init__(self):self.s1 = []self.s2 = []def push(self, node):# write code hereself.s1.append(node)def pop(self):# return xxif self.s2:return self.s2.pop()else:# 将s1中的数据依次取出放入s2中while self.s1:self.s2.append(self.s1.pop())return self.s2.pop()
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。class Solution:def minNumberInRotateArray(self, rotateArray):# write code heredef getMin(low,high,arr):if low > high:return 0if low == high:return arr[low]mid = (low+high)//2if arr[mid-1] > arr[mid]:return arr[mid]elif arr[mid] > arr[mid+1]:return arr[mid+1]elif arr[mid] < arr[high]:return getMin(low, mid-1, arr)elif arr[mid] > arr[low]:return getMin(mid+1, high, arr)else:return min(getMin(mid+1, high, arr), getMin(low, mid-1, arr))return getMin(0, len(rotateArray)-1, rotateArray)
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39class Solution:def Fibonacci(self, n):if n == 0:return 0if n == 1:return 1# write code herefibNMinusOne = 0fibNMinusTwo = 1res = 0for i in range(2, n+1):res = fibNMinusOne + fibNMinusTwofibNMinusOne = fibNMinusTwofibNMinusTwo = resreturn res
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。class Solution:def jumpFloor(self, number):# write code hereif number <= 0:return 0res = [1, 2]if number == 1:return res[0]if number == 2:return res[1]minus1 = 1minus2 = 2for i in range(3, number+1):res = minus1 + minus2minus1 = minus2minus2 = resreturn res
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。class Solution:def jumpFloorII(self, number):# write code hereif number <= 0:return 0if number == 1:return 1if number == 2:return 2minus = 2for i in range(3, number+1):res = 2*minusminus = resreturn res
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?class Solution:def rectCover(self, number):# write code hereif number <= 0:return 0if number == 1:return 1if number == 2:return 2minus1 = 1minus2 = 2res = 0for i in range(3, number+1):res = minus1 + minus2minus1 = minus2minus2 = resreturn res
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。class Solution:def NumberOf1(self, n):# write code here‘‘‘count = 0# 由于这里有32,所以不会陷入死循环的状态for i in range(32):count += (1 & n>>i)return count#return sum([(n>>i & 1) for i in range(0,32)])‘‘‘count = 0# 由于python是动态语言,所以数的大小会根据需要自动改变,这里需要控制为32位while (n & 0xffffffff):count += 1n = (n-1) & nreturn count
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。class Solution:def Power(self, base, exponent):# write code here# return base**exponentif base == 0 and exponent < 0:# 无意义return 0res = 1i = 1abs_exponent = abs(exponent)while i <= abs_exponent:res *= basei += 1if exponent <= 0:return 1/reselse:return res
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。class Solution:def reOrderArray(self, array):# write code here‘‘‘# 采用冒泡算法排序for i in range(len(array)-1):for j in range(0, len(array)-i-1):if array[j] % 2 == 0 and array[j+1] % 2 == 1:array[j], array[j+1] = array[j+1], array[j]return array‘‘‘# 采用额外数组法res = []l = len(array)for i in range(len(array)):if array[l-i-1] % 2 != 0:res.insert(0, array[l-i-1])if array[i] % 2 == 0:res.append(array[i])return res
输入一个链表,输出该链表中倒数第k个结点。class Solution:def FindKthToTail(self, head, k):# write code hereif not head:return# python中的数据是没有头结点的l1 = headl2 = l1i = 0while i < k:l2 = l2.nexti += 1if not l2 and i < k:returnwhile l2:l1 = l1.nextl2 = l2.nextreturn l1
输入一个链表,反转链表后,输出新链表的表头。class Solution:# 返回ListNodedef ReverseList(self, pHead):# write code here# 就地转换法if not pHead:returnpre = pHeadcur = pHead.nextpHead.next = Nonewhile cur:next = cur.nextcur.next = prepre = curcur = nextreturn pre
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。class Solution:# 返回合并后列表def Merge(self, pHead1, pHead2):# write code hereif not pHead1:return pHead2if not pHead2:return pHead1head = pHead1pre = pHead1next_p = pHead2.nextwhile pHead1 and pHead2:if pHead1.val <= pHead2.val:pre = pHead1pHead1 = pHead1.nextelse:pre.next = pHead2pHead2.next = pHead1pre = pHead1pHead1 = pHead1.nextpHead2 = next_pif pHead2:next_p = pHead2.next# 判断是哪个指针为Noneif not pHead1:pre.next = pHead2return headif not pHead2:return head
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)class Solution:def HasSubtree(self, pRoot1, pRoot2):# write code hereif not pRoot2 or not pRoot1:return Falsereturn self.is_subtree(pRoot1, pRoot2) or self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)def is_subtree(self, A, B):if not B:return Trueif not A or A.val != B.val:return Falsereturn self.is_subtree(A.left, B.left) and self.is_subtree(A.right, B.right)
操作给定的二叉树,将其变换为源二叉树的镜像。class Solution:# 返回镜像树的根节点def Mirror(self, root):# write code hereif root:tmp = root.leftroot.left = root.rightroot.right = tmpself.Mirror(root.left)self.Mirror(root.right)
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.class Solution:# matrix类型为二维列表,需要返回列表def printMatrix(self, matrix):# write code hereif not matrix:return matrixres = []startX = 0while len(matrix) > 2*startX and len(matrix[0]) > 2*startX:res.extend(self.print_matrix_incircle(matrix, startX))startX += 1return resdef print_matrix_incircle(self, matrix, start):res = []endX = len(matrix[0]) - 1 -startendY = len(matrix) - 1 - start# 从左往右打印,没有约束条件for i in range(start, endX+1):print(matrix[start][i])res.append(matrix[start][i])# 从上往下打印,至少有两行if endY > start:for i in range(start+1, endY+1):print(matrix[i][endX])res.append(matrix[i][endX])# 从右往左打印,至少有两行两列if start < endX and endY > start:for i in range(endX-1, start-1, -1):print(matrix[endY][i])res.append(matrix[endY][i])# 从下往上打印,至少有三行两列if start < endY-1 and start<endX:for i in range(endY-1, start, -1):print(matrix[i][start])res.append(matrix[i][start])return res
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。# -*- coding:utf-8 -*-class Solution:def __init__(self):self.stack = []self.stack2 = []def push(self, node):# write code hereself.stack.append(node)if not self.stack2:self.stack2.append(node)elif node <= self.stack2[-1]:self.stack2.append(node)def pop(self):# write code hereif self.stack[-1] == self.stack2[-1]:self.stack2.pop()return self.stack.pop()def top(self):# write code herereturn self.stack[-1]def min(self):# write code herereturn self.stack2[-1]
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)class Solution:def IsPopOrder(self, pushV, popV):# write code hereif len(pushV) != len(popV):return Falsei = 0j = 0stack = []while i < len(pushV):stack.append(pushV[i])i += 1while stack and stack[-1] == popV[j]:stack.pop()j += 1#return not stack and j == len(popV)return not stack
从上往下打印出二叉树的每个节点,同层节点从左至右打印。from collections import dequeclass Solution:# 返回从上到下每个节点值列表,例:[1,2,3]def PrintFromTopToBottom(self, root):# write code hereif not root:return []res = []queue = deque()queue.append(root)while queue:root = queue.popleft()res.append(root.val)if root.left:queue.append(root.left)if root.right:queue.append(root.right)return res
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif not sequence:return Falseif len(sequence) == 1:return Trueroot = sequence[-1]i = 0while i < len(sequence)-1:if sequence[i] > root:breaki += 1j = i# 判断后面的数是否都大于root值while j < len(sequence)-1:if sequence[j] < root:return Falsej += 1if i == 0:return self.VerifySquenceOfBST(sequence[i:len(sequence)-1])elif i == len(sequence) - 1:return self.VerifySquenceOfBST(sequence[:i])else:return self.VerifySquenceOfBST(sequence[:i]) and self.VerifySquenceOfBST(sequence[i:len(sequence)-1])
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)class Solution:# 返回二维列表,内部每个列表表示找到的路径def FindPath(self, root, expectNumber):# write code hereres = []def equal_path(root, expectNumber, path, res):if not root:returnpath.append(root.val)if not root.left or not root.right:if sum(path) == expectNumber:res.append([i for i in path])equal_path(root.left, expectNumber, path, res)equal_path(root.right, expectNumber, path, res)path.pop()equal_path(root, expectNumber, [], res)return res
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)class Solution:# 返回 RandomListNodedef Clone(self, pHead):# write code here‘‘‘# 空间换时间的方法if not pHead:return pHeadsource_copy = {}copy_head = RandomListNode(pHead.label)source_copy[id(pHead)] = copy_headcopy_normal_p = copy_headnormal_p = pHead.next# 对节点进行复制while normal_p:node = RandomListNode(normal_p.label)source_copy[id(normal_p)] = nodecopy_normal_p.next = nodecopy_normal_p = nodenormal_p = normal_p.next# 对特殊指针进行复制special_p = pHeadcopy_special_p = copy_headwhile special_p:if special_p.random:copy_special_p.random = source_copy[id(special_p.random)]special_p = special_p.nextcopy_special_p = copy_special_p.nextreturn copy_head‘‘‘if not pHead:return pHeadself.insert(pHead)self.dup_random(pHead)return self.split(pHead)# 嵌入-复制-分离法# 将复制主干内容嵌入原链表def insert(self, pHead):pre = pHeadwhile pre:back = pre.nextnode = RandomListNode(pre.label)pre.next = nodenode.next = backpre = back# 复制随机指针def dup_random(self, pHead):pre = pHeaddup = pHead.nextwhile dup.next:if pre.random:dup.random = pre.random.nextif dup.next:dup = dup.next.nextpre = pre.next.next# 分离链表def split(self, pHead):‘‘‘pNode=pHead#pClonedHead=None#pCloned=Noneif pHead:pClonedHead=pCloned=pNode.nextpNode.next=pCloned.nextpNode=pCloned.nextwhile pNode:pCloned.next=pNode.nextpCloned=pCloned.nextpNode.next=pCloned.nextpNode=pNode.nextreturn pClonedHead‘‘‘# 在分开链表的时候,必须把最后一个连接也要去掉,不去掉所以出了很大的问题pNode = pHeadpCloneHead= pClone = pNode.nextwhile pClone.next:pNode.next = pClone.nextpNode = pClone.nextpClone.next = pNode.nextpClone = pNode.next# 切断最后一个连接pNode.next = Nonereturn pCloneHead
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。class Solution:def __init__(self):self.pHead = Noneself.pEnd = Nonedef Convert(self, pRootOfTree):# write code hereif not pRootOfTree:returnself.Convert(pRootOfTree.left)pRootOfTree.left = self.pEndif not self.pHead:self.pHead = pRootOfTreeelse:self.pEnd.right = pRootOfTreeself.pEnd = pRootOfTreeself.Convert(pRootOfTree.right)return self.pHead
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。class Solution:def Permutation(self, ss):# write code hereif not ss:return []ss = list(ss)res = []self.perm(ss, res, 0)uniq = list(set(res))return sorted(uniq)def perm(self, ss, res, start):if start == len(ss)-1:res.append("".join(ss))else:i = startwhile i < len(ss):ss[i], ss[start] = ss[start], ss[i]self.perm(ss, res, start+1)ss[i], ss[start] = ss[start], ss[i]i += 1
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。class Solution:def MoreThanHalfNum_Solution(self, numbers):# write code here‘‘‘# 方法一:采用空间换时间count_dic = {}for i in range(len(numbers)):count_dic[numbers[i]] = count_dic.get(numbers[i], 0) + 1if count_dic[numbers[i]] > len(numbers) >> 1:return numbers[i]return 0‘‘‘# 方法二:采用partition方法,类快排的方法,找到中位数begin = 0end = len(numbers) - 1return self.get_more_than_half(numbers, begin, end)def get_more_than_half(self, numbers, begin, end):index = self.partition(numbers, begin, end)while index != len(numbers) >> 1:if index < len(numbers) >> 1:index = self.partition(numbers,index+1, end)elif index > len(numbers) >> 1:index = self.partition(numbers, begin, index-1)count = 0for i in range(len(numbers)):if numbers[i] == numbers[index]:count += 1return numbers[index] if count > len(numbers) >> 1 else 0def partition(self, numbers, begin, end):index = beginkey = numbers[index]while begin < end:while begin < end and numbers[end] >= key:end -= 1numbers[begin] = numbers[end]while begin < end and numbers[begin] <= key:begin += 1numbers[end] = numbers[begin]numbers[begin] = keyreturn begin
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。class Solution:def GetLeastNumbers_Solution(self, tinput, k):# write code here# 采用partition的方法if k == 0 or len(tinput) < k:#if not tinput or k == 0 or len(tinput) < k:return []start = 0end = len(tinput) -1index = self.partition(tinput, start, end)while index != k-1:if index > k-1:index = self.partition(tinput, start, index-1)elif index < k-1:index = self.partition(tinput, index+1, end)res = sorted(tinput[:k])return resdef partition(self, tinput, start, end):key = tinput[start]while start < end:if start < end and tinput[end] >= key:end -= 1tinput[start] = tinput[end]if start < end and tinput[start] <= key:start += 1tinput[end] = tinput[start]tinput[start] = keyreturn start
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)class Solution:def FindGreatestSumOfSubArray(self, array):# write code hereif not array:return 0nEnd = array[0]nAll = array[0]for i in range(1, len(array)):if nEnd + array[i] < array[i]:nEnd = array[i]else:nEnd += array[i]nAll = max(nEnd, nAll)return nAll
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。class Solution:def NumberOf1Between1AndN_Solution(self, n):# write code hereres = 0while True:# 首先判断n的位数n_copy = ncount = 0while n_copy:n_copy //= 10count += 1middle_num = 0for i in range(count - 1):middle_num += n // (10 ** i) % 10 * 10**ires += self.get_count_1(n, count, middle_num)n = middle_numif n < 2:breakreturn resdef get_count_1(self, n, count, middle_num):if n > 0 and n < 10:return 1if n < 1:return 0num = 0copy_n = ncount_copy = countwhile count_copy > 1:copy_n //= 10count_copy -= 1if copy_n > 1:num += 10 ** (count - 1)else:num += middle_num+1num += copy_n * (count - 1) * 10 ** (count - 2)return num
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。class Solution:def PrintMinNumber(self, numbers):# write code herereturn "".join(sorted([str(i) for i in numbers], cmp = lambda x, y: int(x+y) - int(y+x)))
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。class Solution:def GetUglyNumber_Solution(self, index):# write code hereif index < 1:return 0ugly_number = [1]if index == 1:return 1m2 = 0m3 = 0m5 = 0i = 1while i < index:num = min(ugly_number[m2]*2, ugly_number[m3]*3, ugly_number[m5]*5)ugly_number.append(num)# 这里的if不能用elif,有可能该数为2或者3或者5的最小公倍数if ugly_number[m2]*2 <= num:m2 += 1if ugly_number[m3]*3 <= num:m3 += 1if ugly_number[m5]*5 <= num:m5 += 1i += 1return ugly_number[-1]
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).class Solution:def FirstNotRepeatingChar(self, s):# write code here# 建立hash表,第一次遍历s添加次数到hash表,第二次遍历s找到第一个只出现一次的字符res = {}for i in s:res[i] = res.get(i, 0) + 1for i in s:if res[i] == 1:return s.index(i)return -1
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007class Solution:def InversePairs(self, data):# write code hereif not data:return 0data_copy = [i for i in data]count = self.InversePairsCore(data, data_copy, 0, len(data)-1)return count% 1000000007def InversePairsCore(self, data, data_copy, start, end):if start == end:data_copy[start] = data[start]return 0length = (end-start)//2left = self.InversePairsCore(data_copy, data, start, start+length)right = self.InversePairsCore(data_copy, data, start+length+1, end)i = start+lengthj = endindexCopy = endcount = 0while i>=start and j >=start+length+1:if data[i]>data[j]:data_copy[indexCopy] = data[i]indexCopy -= 1i -= 1count += j-start-lengthelse:data_copy[indexCopy] = data[j]indexCopy -= 1j -= 1while i >= start:data_copy[indexCopy] = data[i]i -= 1indexCopy -= 1while j >= start+length+1:data_copy[indexCopy] = data[j]j -= 1indexCopy -= 1return left + right + count
输入两个链表,找出它们的第一个公共结点。class Solution:def FindFirstCommonNode(self, pHead1, pHead2):# write code hereif not pHead1 or not pHead2:return Nonel1 = 0l2 = 0p1 = pHead1p2 = pHead2while p1:p1 = p1.nextl1 += 1while p2:p2 = p2.nextl2 += 1if l1 > l2:i = 0while i < abs(l1-l2):pHead1= pHead1.nexti += 1while pHead1 and pHead2:if pHead1 == pHead2:return pHead1else:pHead1 = pHead1.nextpHead2 = pHead2.nextelse:i = 0while i < abs(l1-l2):pHead2 = pHead2.nexti += 1while pHead1 and pHead2:if pHead1 == pHead2:return pHead2else:pHead1 = pHead1.nextpHead2 = pHead2.nextreturn None
统计一个数字在排序数组中出现的次数。# -*- coding:utf-8 -*-class Solution:def GetNumberOfK(self, data, k):# write code hereif not data:return 0start = 0# end指针为数组下标end = len(data)-1flag = 0while start <= end:mid = (start+end) >> 1if data[mid] > k:end = mid-1elif data[mid] < k:start = mid+1else:flag = 1breakif flag == 0:return 0count = 0i = midwhile i >= 0 and data[i] == k:count += 1i -= 1j = mid+1while j < len(data) and data[j] == k:count += 1j += 1return count
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。class Solution:def TreeDepth(self, pRoot):# write code hereif not pRoot:return 0return max(1 + self.TreeDepth(pRoot.left), 1 + self.TreeDepth(pRoot.right))
输入一棵二叉树,判断该二叉树是否是平衡二叉树。class Solution:def IsBalanced_Solution(self, pRoot):# write code here‘‘‘if not pRoot:return Truereturn self.IsBanlanced(pRoot) and self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right)def IsBanlanced(self, pRoot):if abs(self.height(pRoot.left) - self.height(pRoot.right)) <= 1:return Trueelse:return Falsedef height(self, pRoot):if not pRoot:return 0return max(1+self.height(pRoot.left), 1+self.height(pRoot.right))‘‘‘# 通过后续遍历自下往上进行遍历return self.dfs(pRoot) != -1def dfs(self, pRoot):if not pRoot:return 0left = self.dfs(pRoot.left)if left == -1:return -1right = self.dfs(pRoot.right)if right == -1:return -1if abs(left-right) > 1:return -1return max(left, right) + 1
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。class Solution:# 返回[a,b] 其中ab是出现一次的两个数字def FindNumsAppearOnce(self, array):# write code herec = 0#for i in array:# c ^= ic = reduce(lambda x, y: x^y, array)k = 0d = cwhile d & 1 != 1:k += 1d = d >> 1s = []for i in array:if i >> k & 1 == 1:s.append(i)e = 0e = reduce(lambda x, y: x^y, s)return [c^e, e]
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!class Solution:def FindContinuousSequence(self, tsum):# write code here# 建立二维数组sequence_sum = [[0] * (tsum / 2 + 1) for _ in range(tsum / 2 + 1)]# 为对角线数据赋予初始值for i in range(tsum / 2 + 1):sequence_sum[i][i] = i + 1# 动态规划填充数组信息,并记录为100的数量res = []for i in range(1, tsum / 2 + 1):for j in range(i):sequence_sum[i][j] = sequence_sum[i - 1][j] + (i + 1)if sequence_sum[i][j] == tsum:res.append(range(j+1, i + 2))return res
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。class Solution:def FindNumbersWithSum(self, array, tsum):# write code hereif not isinstance(array, list):return []res = []begin = 0end = len(array)-1while begin < end:if array[begin] + array[end] > tsum:end -= 1elif array[begin] + array[end] < tsum:begin += 1else:# 通过数学公式证明,边缘的两个数字乘积一定小于中间两个数字乘积return [array[begin], array[end]]return []
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!class Solution:def LeftRotateString(self, s, n):# write code here‘‘‘# 空间换时间if not s:return ""n %= len(s)return s[n:]+s[:n]‘‘‘# 翻转法if not s:return ""s = list(s)n %= len(s)begin = 0end = n-1while begin < end:s[begin], s[end] = s[end], s[begin]begin += 1end -= 1begin = nend = len(s)-1while begin < end:s[begin], s[end] = s[end], s[begin]begin += 1end -= 1begin = 0end = len(s)- 1while begin < end:s[begin], s[end] = s[end], s[begin]begin += 1end -= 1return "".join(s)
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?class Solution:def ReverseSentence(self, s):# write code herereturn " ".join([i[::-1] for i in s.split(" ")])[::-1]
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。class Solution:def IsContinuous(self, numbers):# write code hereif not numbers:return Falsenumbers = sorted(numbers)count_0 = 0count_blank = 0for i in range(len(numbers)):if numbers[i] == 0:count_0 += 1elif numbers[i] != 0:breakfor j in range(i, len(numbers)-1):if numbers[j+1] - numbers[j] != 1:if numbers[j+1] - numbers[j] == 0:return Falsecount_blank += numbers[j+1] - numbers[j]-1if count_0 >= count_blank:return Trueelse:return False
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)class Solution:def LastRemaining_Solution(self, n, m):# write code here# 动态规划,寻找规律if n < 1 or m < 1:return -1last = 0for i in range(2, n+1):last = (last+m)%ireturn last# 循环链表模拟法# 依次循环m次,到达则删除该节点,同时判断node.next == node,如果True返回该节点
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。class Solution:def Sum_Solution(self, n):# write code here# and 运算,如果n为False, 返回False, 如果True,返回后面的数return n and (n + self.Sum_Solution(n-1))
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。class Solution:def Add(self, num1, num2):# write code herewhile True:res = (num1 ^ num2) & 0xffffffffcarry = ((num1 & num2) << 1) & 0xffffffffif carry == 0:return res if res <= 0x7fffffff else ~(res ^ 0xffffffff)num1 = resnum2 = carry
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。class Solution:def StrToInt(self, s):# write code hereif not s:return 0if s[0] == ‘+‘:flag = 1s = s[1:]elif s[0] == ‘-‘:flag = 0s = s[1:]else:flag = -1asc_0 = ord(‘0‘)asc_9 = ord(‘9‘)res = 0jinwei = 1for i in range(len(s)-1, -1,-1):if ord(s[i]) >= asc_0 and ord(s[i]) <= asc_9:res += (ord(s[i]) - asc_0) * jinweijinwei *= 10else:return 0return -res if flag == 0 else res
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。class Solution:# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]# 函数返回True/Falsedef duplicate(self, numbers, duplication):# write code herei = 0while True:if i >= len(numbers):return Falseif numbers[i] != i:if numbers[i] == numbers[numbers[i]]:duplication[0] = numbers[i]return Trueindex = numbers[i]numbers[i], numbers[index] = numbers[index], numbers[i]else:i += 1
给定一个数组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]。不能使用除法。class Solution:def multiply(self, A):# write code hereb = [1]*len(A)multi = 1for i in range(1, len(A)):multi *= A[i-1]b[i] = multimulti = 1for i in range(len(A)-2, -1, -1):multi *= A[i+1]b[i] *= multireturn b
请实现一个函数用来匹配包括‘.‘和‘*‘的正则表达式。模式中的字符‘.‘表示任意一个字符,而‘*‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配class Solution:# s, pattern都是字符串def match(self, s, pattern):# write code here# 两个字符串都为空,返回Trueif len(s) == 0 and len(pattern) == 0:return Trueif len(s) > 0 and len(pattern) == 0:return False# 考虑第二个模式字符串是否为*的情况if len(pattern) > 1 and pattern[1] == ‘*‘:if len(s) > 0 and (s[0] == pattern[0] or pattern[0] == ‘.‘):return self.match(s, pattern[2:]) or self.match(s[1:], pattern[2:]) or self.match(s[1:], pattern)else:return self.match(s, pattern[2:])if len(s)>0 and (pattern[0] == ‘.‘ or pattern[0] == s[0]):return self.match(s[1:], pattern[1:])return False
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。class Solution:# s字符串def isNumeric(self, s):# write code hereallow_char = [‘+‘,‘-‘,‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘e‘,‘E‘,‘.‘]already_action = 0after_e = 0count_dot = 0count_plus_mins = 0for i in range(len(s)):if s[i] not in allow_char:return Falseif s[i] in [‘+‘,‘-‘] and i != 0 and after_e == 0:return Falseif s[i] == ‘.‘ and after_e == 1:return Falseif s[i] == ‘.‘ and after_e == 0:count_dot += 1if count_dot > 1:return Falseif s[i] in [‘e‘, ‘E‘] and after_e == 1:return Falseif s[i] in [‘+‘, ‘-‘] and after_e == 1:count_plus_mins += 1if count_plus_mins > 1:return Falseif s[i] in [‘e‘, ‘E‘]:after_e = 1if i == len(s)-1:return Falsereturn True
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。class Solution:def __init__(self):self.s=‘‘self.count_dic = {}# 返回对应chardef FirstAppearingOnce(self):# write code here# 利用hash表存储每个字符出现的次数,时间复杂度为O(n)for i in range(len(self.s)):if self.count_dic[self.s[i]] == 1:return self.s[i]return ‘#‘def Insert(self, char):# write code hereself.s += charself.count_dic[char] = self.count_dic.get(char,0)+1
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。class Solution:def EntryNodeOfLoop(self, pHead):# write code hereif not pHead or not pHead.next:return Nonelow = pHeadfast = pHeadwhile fast:low = low.nextfast = fast.next.nextif low == fast:breakif not fast:return Nonelow = pHeadwhile low != fast:low= low.nextfast = fast.nextreturn low
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5class Solution:def deleteDuplication(self, pHead):# write code here‘‘‘if not pHead or not pHead.next:return pHeadnewHead = ListNode("a")newHead.next = pHeadpre = newHeadcur = pHeadflag = 0while cur.next:if cur.val == cur.next.val:flag = 1cur.next = cur.next.nextelse:if flag == 1:pre.next = cur.nextcur = cur.nextflag = 0else:pre = pre.nextcur = cur.nextif flag == 1:pre.next = cur.nextreturn newHead.next‘‘‘# 采用递归的方式删除if not pHead or not pHead.next:return pHeadpNext = pHead.nextif pNext.val != pHead.val:pHead.next = self.deleteDuplication(pHead.next)else:while pNext and pNext.val == pHead.val:pNext = pNext.nextif not pNext:return Noneelse:pHead = self.deleteDuplication(pNext)return pHead
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。class Solution:def GetNext(self, pNode):# write code hereif not pNode:return pNodeif pNode.right:r_node = pNode.rightwhile r_node.left:r_node = r_node.leftreturn r_nodewhile pNode.next:father_node = pNode.nextif father_node.left == pNode:return father_nodepNode = father_node
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。class Solution:def isSymmetrical(self, pRoot):# write code herereturn self.judge_symmetry(pRoot, pRoot)def judge_symmetry(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.judge_symmetry(pRoot1.left, pRoot2.right) and self.judge_symmetry(pRoot1.right, pRoot2.left)
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。from collections import dequeclass Solution:def Print(self, pRoot):# write code hereif not pRoot:return []res = deque([pRoot])tmp = []ret = []last = pRootflag = 1while res:node = res.popleft()tmp.append(node.val)if node.left:res.append(node.left)if node.right:res.append(node.right)if node == last:ret.append(tmp if flag == 1 else tmp[::-1])tmp = []flag = -flagif res:last = res[-1]return ret
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。class Solution:# 返回二维列表[[1,2],[4,5]]def Print(self, pRoot):# write code hereif not pRoot:return []from collections import dequeq = deque([pRoot])ret = []tmp = []last = pRootwhile q:node = q.popleft()tmp.append(node.val)if node.left:q.append(node.left)if node.right:q.append(node.right)if node == last:ret.append(tmp)tmp = []if q: last=q[-1]return ret
请实现两个函数,分别用来序列化和反序列化二叉树class Solution:flag = -1def Serialize(self, root):# write code hereif not root:return ‘$‘return str(root.val)+‘,‘+self.Serialize(root.left)+‘,‘+self.Serialize(root.right)def Deserialize(self, s):# write code hereself.flag += 1l = s.split(‘,‘)if self.flag >= len(s):return Noneroot = Noneif l[self.flag] != ‘$‘:root = TreeNode(int(l[self.flag]))root.left = self.Deserialize(s)root.right = self.Deserialize(s)return root
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。class Solution:# 返回对应节点TreeNodedef KthNode(self, pRoot, k):# write code hereif k <= 0 or not pRoot:return Nonebuffer = self.find_k_num(pRoot, [])if len(buffer) < k:return Noneelse:return buffer[k-1]def find_k_num(self, pRoot, buffer):if not pRoot:return bufferself.find_k_num(pRoot.left, buffer)buffer.append(pRoot)self.find_k_num(pRoot.right, buffer)return buffer
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。class Solution:def __init__(self):self.data = []def Insert(self, num):# write code here# 采用二分法实现数据的有序插入if not self.data:self.data.append(num)returnpre = 0back = len(self.data)-1while pre <= back:mid = (back+pre)//2if mid == 0:if num < self.data[0]:self.data.insert(0, num)else:self.data.insert(1, num)returnif mid == len(self.data)-1:if num > self.data[-1]:self.data.append(num)else:self.data.insert(-1, num)returnif num < self.data[mid]:back = mid-1elif num > self.data[mid]:pre = mid+1else:self.data.insert(mid, num)def GetMedian(self, data):# write code hereif not self.data:returnif len(self.data) % 2 == 1:return self.data[len(self.data)//2]else:return (self.data[len(self.data)//2-1] + self.data[len(self.data)//2])/2.0
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。from collections import dequeclass Solution:def maxInWindows(self, num, size):# write code hereif not num or size > len(num) or size < 1:return []res = []window = deque()for i in range(size):while window and num[i] >= num[window[-1]]:window.pop()window.append(i)for i in range(size, len(num)):res.append(num[window[0]])while window and num[i] >= num[window[-1]]:window.pop()if window and i - window[0] >= size:window.popleft()window.append(i)res.append(num[window[0]])return res
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。class Solution:def hasPath(self, matrix, rows, cols, path):# write code herefor i in range(rows):for j in range(cols):if matrix[i*cols+j] == path[0]:if self.find(list(matrix), rows, cols, path[1:], i, j):return Truereturn Falsedef find(self, matrix, rows, cols, path, i, j):if not path:return Truematrix[i*cols+j] = ‘0‘if j+1 < cols and matrix[i*cols+j+1] == path[0]:return self.find(matrix, rows, cols, path[1:],i,j+1)elif j-1 >= 0 and matrix[i*cols+j-1] == path[0]:return self.find(matrix, rows, cols, path[1:],i,j-1)elif i+1 < rows and matrix[(i+1)*cols+j] == path[0]:return self.find(matrix, rows, cols, path[1:],i+1,j)elif i-1 >= 0 and matrix[(i-1)*cols+j] == path[0]:return self.find(matrix, rows, cols,path[1:],i-1,j)else:return False
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?class Solution:def movingCount(self, threshold, rows, cols):# write code herevisited = [1] * rows * colsif threshold < 0:return 0return self.get_moving_count(threshold, rows, cols, 0, 0, 1, visited)def get_moving_count(self, threshold, rows, cols, i, j, count, visited):visited[i * cols + j] = 0if j + 1 < cols and visited[i * cols + j + 1] and self.getDigitSum(i, j + 1) <= threshold:count = self.get_moving_count(threshold, rows, cols, i, j + 1, count+1, visited)if j - 1 >= 0 and visited[i * cols + j - 1] and self.getDigitSum(i, j - 1) < threshold:count = self.get_moving_count(threshold, rows, cols, i, j - 1, count+1, visited)if i + 1 < rows and visited[(i + 1) * cols + j] and self.getDigitSum(i+1, j) <= threshold:count = self.get_moving_count(threshold, rows, cols, i + 1, j, count+1, visited)if i - 1 >= 0 and visited[(i - 1) * cols + j] and self.getDigitSum(i-1, j) <= threshold:count = self.get_moving_count(threshold, rows, cols, i - 1, j, count+1, visited)return countdef getDigitSum(self,num1, num2):sum = 0while num1 > 0:sum += num1%10num1 /= 10while num2 > 0:sum += num2%10num2 /= 10return sum
原文:https://www.cnblogs.com/sancica/p/11059686.html