剑指offer
程旭员
人生苦短,我用Python
GitHub:https://github.com/MrLuoj
展开
-
剑指offer面试题66. 构建乘积数组
题目描述给定一个数组 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 constructArr(self, a; List[int])->List[int]: b, tmp = [1]*len(a), 1 for i in range(1, len(a)): b[i] = b[i-1]*原创 2020-05-30 10:47:20 · 383 阅读 · 1 评论 -
剑指offer面试题65. 不用加减乘除做加法(位运算)
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。思路详见链接代码class Solution: def add(self, a:int, b:int)->int: x = 0xffffffff a, b = a & x, b & x while b != 0: a, b = (a ^ b), (a & b) << 1 & x return a if a <=原创 2020-05-30 10:46:42 · 413 阅读 · 1 评论 -
剑指offer面试题63. 股票的最大利润(动态规划)
题目描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路详见链接代码class Solution: def maxProfit(self, prices:List[int])->int: cost, profit = float("inf"), 0 for price in prices: cost = min(cost, price) profit = max(profit, price - cost) retur原创 2020-05-28 11:26:48 · 750 阅读 · 0 评论 -
剑指offer面试题64. 求1+2+…+n(逻辑符短路)(递归)
题目描述求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路详见链接代码class Solution: def __init__(self): self.res = 0 def sumNums(self, n:int)->int: n > 1 and self.sumNums(n-1) self.res += n return self.res复杂度时间复杂度 O(n)原创 2020-05-28 11:25:51 · 213 阅读 · 0 评论 -
剑指offer面试题61. 扑克牌中的顺子(排序)(遍历)
题目描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。思路详见链接代码class Solution: def isStraight(self, nums:List[int])->bool: joker = 0 nums.sort() for i in range(4): if nums[i] == 0: joker += 1原创 2020-05-27 15:32:37 · 240 阅读 · 1 评论 -
剑指offer面试题58 - II. 左旋转字符串(切片)(一行代码)
题目描述字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。思路详见链接代码class Solution: def reverseLeftWords(self, s:str, n:int)->str: return s[n:] + s[:n]复杂度时间复杂度 O(N) : 其中 N为字符串 s 的长度,字符串切片函数为线性时间复杂原创 2020-05-25 11:41:57 · 176 阅读 · 1 评论 -
剑指offer面试题58 - I. 翻转单词顺序(双指针)
题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。思路详见链接代码class Solution: def reverseWords(self, s:str) -> str: s = s.strip() #去除首尾空格 i = j = len(s) - 1 res = [] while i >= 0: w原创 2020-05-25 11:40:13 · 232 阅读 · 1 评论 -
剑指offer面试题55 - II. 平衡二叉树(后序遍历)(剪枝)
题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路详见链接代码class Solution: def isBalanced(self, root:TreeNode)->bool: def recur(root): if not root: return return 0 left = recur(root.left) if left == -1: return -1 ri原创 2020-05-23 16:14:45 · 191 阅读 · 0 评论 -
剑指offer面试题55 - I. 二叉树的深度(DFS)(递归)
题目描述输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。思路详见链接代码class Solution: def maxDepth(self, root:TreeNode)->int: if not root: return 0 return max(self.maxDepth(root.left),self.maxDepth(root.right)) + 1复杂度时间复杂度 O(N) :原创 2020-05-23 16:13:40 · 196 阅读 · 1 评论 -
剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)
题目描述给定一棵二叉搜索树,请找出其中第k大的节点。思路详见链接代码class Solution: def kthLargest(self, root:TreeNode, k:int)->int: def dfs(root): if not root: return dfs(root.right) if self.k == 0: return self.k -= 1 if self.k == 0: self.res = root.val原创 2020-05-21 10:45:20 · 232 阅读 · 1 评论 -
剑指offer面试题52. 两个链表的第一个公共节点(双指针法)
题目描述输入两个链表,找出它们的第一个公共节点。思路详见链接代码class Solution: def getIntersectionNode(self, headA:ListNode, headB:ListNode)->ListNode: node1, node2 = headA. headB while node1 != node2: node1 = node1.next if node1 else headB node2 = node2.next if node原创 2020-05-21 10:44:21 · 208 阅读 · 1 评论 -
剑指offer面试题50. 第一个只出现一次的字符(哈希表)
题目描述在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。思路详见链接代码class Solution: def firstUniqueChar(self, s:str)->str: dic = {} for c in s: dic[c] = not c in dic for c in s: if dic[c]: return c return ' '时间复杂度 O(N): N为字符串 s 的长度;需遍历 s 两轮原创 2020-05-19 20:24:38 · 179 阅读 · 1 评论 -
剑指offer面试题49. 丑数
题目描述我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。思路详见链接代码class Solution: def nthUglyNumber(self, n:int)->int: dp = [1]*n a, b, c = 0, 0, 0 for i in range(1,n): n2, n3, n5 = dp[a]*2, dp[b]*3, dp[c]*5 dp[i] = min(n2, n3, n5)原创 2020-05-17 19:55:18 · 250 阅读 · 3 评论 -
剑指offer面试题47. 礼物的最大价值(动态规划)
题目描述在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?思路详见链接代码class Solution: def maxValue(self, grid:List[List[int]])->int: m, n = len(grid), len(grid[0]) for j in range原创 2020-05-17 19:54:49 · 416 阅读 · 1 评论 -
剑指offer面试题42. 连续子数组的最大和(动态规划)
题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。思路详见链接代码class Solution: def maxSubArray(self, nums:List[int])->int: for i in range(1,len(nums)): nums[i] += max(nums[i-1],0) return max(nums)复杂度时间复杂度 O(N) : 线性遍历数组原创 2020-05-14 22:02:11 · 196 阅读 · 1 评论 -
剑指offer面试题40. 最小的k个数(sort函数)
题目描述输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。思路详见链接代码class Solution: def getLeastNumbers(self,arr:List[int],k:int)->List[int]: arr.sort() return arr[:k]复杂度sort()函数使用 Timsort 方法进行排序,时间复杂度O(NlogN)...原创 2020-05-13 21:26:44 · 193 阅读 · 1 评论 -
剑指offer面试题36. 二叉搜索树与双向链表(中序遍历)(递归)
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。思路详见链接代码#class Node:# def __init__(self, val, left=None, right=None):# self.val = val# self.left = left# self.right = right class Solution: def treeToDoublyList(self,root:'None原创 2020-05-12 10:39:22 · 168 阅读 · 1 评论 -
剑指offer面试题35. 复杂链表的复制(DFS)(深拷贝)
题目描述请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。思路详见链接代码class Solution: def copyRandomList(self, head:'None')->'None': visited = {} #字典 def dfs(head): if not head: return None if hea原创 2020-05-12 10:38:29 · 192 阅读 · 1 评论 -
剑指offer面试题34. 二叉树中和为某一值的路径(先序遍历)(回溯)
题目描述输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。思路详见链接代码class Solution: def pathSum(self, root:TreeNode, sum:int)->List[List[int]]: res, path = [], [] def recur(root, tar): if not root: return path.append(root.v原创 2020-05-09 21:58:56 · 152 阅读 · 2 评论 -
剑指offer面试题30. 包含min函数的栈(辅助栈)
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。思路详见链接代码class MinStack: def __init__(self): self.A, self.B = [], [] def push(self, x:int)->None: self.A.app...原创 2020-05-08 10:26:17 · 241 阅读 · 1 评论 -
剑指offer面试题29. 顺时针打印矩阵(边界问题)
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。思路详见链接代码class Solution: def spiralOrder(self, matrix:[[int]])->[int]: if not matrix: return [] l, r, t, b, res = 0, len(matrix[0])-1, 0, len(matrix)...原创 2020-05-08 10:25:28 · 178 阅读 · 4 评论 -
剑指offer面试题28. 对称的二叉树(递归)
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。思路详见链接代码class Solution: def isSymmetric(self, root:TreeNode)->bool: def recur(L, R): if not L and nor R: return True if not L o...原创 2020-05-07 21:51:30 · 152 阅读 · 1 评论 -
剑指offer面试题27. 二叉树的镜像(递归)
题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。思路详见链接代码class Solution: def mirrorTree(self, root:TreeNode)->TreeNode: if not root: return tmp = root.left root.left = self.mirrorTree(root.right) r...原创 2020-05-01 09:23:28 · 193 阅读 · 2 评论 -
剑指offer面试题25. 合并两个排序的链表(双指针)
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。思路详见链接代码class Solution: def mergeTwolists(self, l1:ListNode, l2:ListNode)->ListNode: cur = dum = ListNode(0) while l1 and l2: if l1.val < l...原创 2020-04-30 20:22:17 · 239 阅读 · 1 评论 -
剑指offer面试题24. 反转链表(双指针)
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。思路详见链接代码class Solution: def reverseList(self, head:ListNode)->ListNode: if not head: return None pre = None cur = head while cur: cur.ne...原创 2020-04-29 11:48:37 · 153 阅读 · 2 评论 -
剑指offer面试题17. 打印从1到最大的n位数
题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。思路详见链接代码class Solution: def printNumbers(self,n:int)->List[int]: res = [] for i in range(1,10**n): res.append(i) ...原创 2020-04-28 11:03:34 · 149 阅读 · 2 评论 -
剑指offer面试题15. 二进制中1的个数(位运算)
题目描述请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。思路详见链接代码class Solution: def hammingWeight(self,n:int)->int: res = 0 while n: res += n & 1 n ...原创 2020-04-27 10:12:58 · 174 阅读 · 2 评论 -
剑指offer面试题14- I. 剪绳子(数学推导)
题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m] 。请问 k[0]k[1]…k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。思路详见链接代码class Solution: def cutting...原创 2020-04-27 10:12:12 · 178 阅读 · 2 评论 -
剑指offer面试题12. 矩阵中的路径(矩阵搜索)(深度优先搜索)(剪枝)
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”...原创 2020-04-25 10:19:53 · 178 阅读 · 1 评论 -
剑指offer面试题10- II. 青蛙跳台阶问题(动态规划)(递归)(斐波那契数列)
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。思路详见链接代码class Solution: def numWays(self, n:int)->int: a, b = 1, 1 for _ in range...原创 2020-04-24 10:32:49 · 219 阅读 · 2 评论 -
剑指offer面试题10- I. 斐波那契数列
题目描述写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:思路详见链接代码class Solution: def fib(self,n:int)->int: a, b = 0, 1 for _ in range(n): a, b = b, a+b return a % 1000000007 ...原创 2020-04-23 14:36:54 · 212 阅读 · 2 评论 -
剑指offer面试题06. 从尾到头打印链表(辅助栈法)
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。思路详见链接代码class Solution: def reversePrint(self,head:ListNode)->List[int]: stack = [] while head: stack.append(head.val) head = head.next retu...原创 2020-04-23 14:36:08 · 194 阅读 · 2 评论 -
剑指offer面试题05. 替换空格
题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。思路详见链接在 Python 和 Java 等语言中,字符串都被设计成不可变的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现。代码class Solution: def replaceSpace(self,s:str)->str: res = [] for c in s: if ...原创 2020-04-23 14:35:11 · 180 阅读 · 2 评论 -
剑指offer面试题57. 和为s的两个数字(双指针)
题目描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。思路详见链接代码class Solution: def twoSum(self,nums:List[int],target:int)->List[int]: i, j = 0, len(nums)-1 while i<j: s ...原创 2020-04-20 10:16:10 · 190 阅读 · 2 评论 -
剑指offer面试题38. 字符串的排列(回溯)
题目描述**输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。**思路详见链接代码class Solution: def permutation(self,s:str)->List[str]: c, res = list(s),[] def dfs(x): if x == len(c) - 1 re...原创 2020-04-20 10:13:47 · 207 阅读 · 1 评论 -
剑指offer面试题18. 删除链表的节点(双指针)(链表)
题目描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。思路详见链接代码class Solution: def deleteNode(self,head:ListNode,val:int)->ListNode: if head.val == val: return head.next pre, cur = head,...原创 2020-04-18 10:38:08 · 154 阅读 · 3 评论 -
剑指offer面试题21. 调整数组顺序使奇数位于偶数前面(双指针)
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路详见链接代码class Solution: def exchange(self, nums:List[int])->List[int]: i, j = 0, len(nums)-1 while i<j: while i<j a...原创 2020-04-16 21:00:05 · 158 阅读 · 1 评论 -
剑指offer面试题16. 数值的整数次方(二分法)
题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。思路详见链接代码class Solution: def myPow(self,x:float,n:int)->float: if x == 0: return 0 res = 1 if n &...原创 2020-04-16 20:54:56 · 150 阅读 · 1 评论 -
剑指offer面试题09. 用两个栈实现队列(队列、栈)
题目描述用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )思路详见链接代码class CQueue: def __init__(self): self.A, self.B = [], [] def appen...原创 2020-04-14 19:59:18 · 212 阅读 · 2 评论 -
剑指offer面试题07. 重建二叉树(递归)(切片)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。思路详见链接代码#class TreeNode:# def __init__(self,x):# self.val = x# self.left = None# self.right = Noneclass Solution: def buildTr...原创 2020-04-13 11:06:50 · 100 阅读 · 2 评论