
程序员面试金典(第 6 版)
子言慕雨
帅~
展开
-
面试题 08.11. 硬币
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例1:输入: n = 5输出:2解释: 有两种方式可以凑成总金额:5=5示例2:输入: n = 10输出:4解释: 有四种方式可以凑成总金额:10=1010=5+5说明:注意:你可以假设:0 <= n (总金额) <= 1000000。原创 2023-08-26 13:36:06 · 180 阅读 · 0 评论 -
面试题 08.09. 括号
面试题 08.09. 括号括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。说明:解集不能包含重复的子集。例如,给出 n = 3,生成结果为:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]思路是:一次递归值确定一个位置,遇到可以多选择地方 求其和......原创 2022-06-18 08:46:07 · 136 阅读 · 0 评论 -
面试题 08.08. 有重复字符串的排列组合
题面试题 08.08. 有重复字符串的排列组合有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。示例1:输入:S = “qqe”输出:[“eqq”,“qeq”,“qqe”]示例2:输入:S = “ab”输出:[“ab”, “ba”]提示:字符都是英文字母。字符串长度在[1, 9]之间。解题思路添加一个set去重代码class Solution: def permutation(self, S: str) -> List[str]:原创 2022-05-31 18:39:49 · 412 阅读 · 0 评论 -
面试题 08.04. 幂集
题面试题 08.04. 幂集幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]解题思路算是一种动态规划 用到 以前所有状态数据 注意 Python 复制数组数据要用 .copy()代码class Solution: def subsets(self, nums: List[int])原创 2022-05-29 11:51:52 · 1149 阅读 · 0 评论 -
面试题 08.02. 迷路的机器人
题设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。网格中的障碍物和空位置分别用 1 和 0 来表示。返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。示例 1:输入:[ [0,0,0], [0,1,0], [0,0,0]]输出: [[0,0],[0,1]原创 2022-05-28 12:10:15 · 152 阅读 · 0 评论 -
面试题 08.01. 三步问题
题三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。示例1:输入:n = 3输出:4说明: 有四种走法示例2:输入:n = 5输出:13来源:力扣(LeetCode)链接:https://leetcode.cn/problems/three-steps-problem-lcci著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。解题思路ans[n原创 2022-05-27 13:13:26 · 132 阅读 · 0 评论 -
面试题 05.08. 绘制直线
题已知一个由像素点组成的单色屏幕,每行均有 w 个像素点,所有像素点初始为 0,左上角位置为 (0,0)。现将每行的像素点按照「每 32 个像素点」为一组存放在一个 int 中,再依次存入长度为 length 的一维数组中。我们将在屏幕上绘制一条从点 (x1,y) 到点 (x2,y) 的直线(即像素点修改为 1),请返回绘制过后的数组。注意:用例保证屏幕宽度 w 可被 32 整除(即一个 int 不会分布在两行上)示例1:输入:length = 1, w = 32, x1 = 30, x2原创 2022-05-27 12:42:36 · 165 阅读 · 0 评论 -
面试题 05.07. 配对交换
题配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。示例1:输入:num = 2(或者0b10)输出 1 (或者 0b01)示例2:输入:num = 3输出:3提示:num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/exchange-lcci著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出原创 2022-05-25 11:47:21 · 1068 阅读 · 0 评论 -
面试题 05.06. 整数转换
题面试题 05.06. 整数转换整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。示例1:输入:A = 29 (或者0b11101), B = 15(或者0b01111)输出:2示例2:输入:A = 1,B = 2输出:2提示:A,B范围在[-2147483648, 2147483647]之间解题思路此处撰写解题思路代码使用与class Solution: def convertInteger(self, A: int, B: int) -> in原创 2022-05-24 18:39:25 · 287 阅读 · 0 评论 -
面试题 05.04. 下一个数
题下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。示例1:输入:num = 2(或者0b10)输出:[4, 1] 或者([0b100, 0b1])示例2:输入:num = 1输出:[2, -1]提示:num的范围在[1, 2147483647]之间;如果找不到前一个或者后一个满足条件的正数,那么输出 -1。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/closed-number-原创 2022-05-24 15:52:23 · 114 阅读 · 0 评论 -
面试题 05.03. 翻转数位
题面试题 05.03. 翻转数位给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。示例 1:输入: num = 1775(110111011112)输出: 8示例 2:输入: num = 7(01112)输出: 4解题思路代码通过左移方式1 再与原数取& 是一种非常好的探求一个数二级制表示方法!大佬题解class Solution: def reverseBits(self, num: int) ->原创 2022-05-21 18:08:12 · 129 阅读 · 0 评论 -
面试题 05.02. 二进制数转字符串
题二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。示例1:输入:0.625输出:“0.101”示例2:输入:0.1输出:“ERROR”提示:0.1无法被二进制准确表示提示:32位包括输出中的 “0.” 这两位。题目保证输入用例的小数位数最多只有 6 位来源:力扣(LeetCode)链接:https://leetcode.cn/problems/bianry-n原创 2022-05-20 10:29:52 · 700 阅读 · 0 评论 -
面试题 05.01. 插入
题面试题 05.01. 插入给定两个整型数字 N 与 M,以及表示比特位置的 i 与 j(i <= j,且从 0 位开始计算)。编写一种方法,使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域,不足之处用 0 补齐。具体插入过程如图所示。题目保证从 i 位到 j 位足以容纳 M, 例如: M = 10011,则 i~j 区域至少可容纳 5 位。示例1:输入:N = 1024(10000000000), M = 19(10011), i = 2, j = 6输出:N原创 2022-05-19 19:22:55 · 131 阅读 · 0 评论 -
面试题 04.12. 求和路径
题给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但是其方向必须向下(只能从父节点指向子节点方向)。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:原创 2022-05-18 11:16:22 · 128 阅读 · 0 评论 -
面试题 04.10. 检查子树
题检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。注意:此题相对书上原题略有改动。示例1:输入:t1 = [1, 2, 3], t2 = [2]输出:true示例2:输入:t1 = [1, null, 2, 4], t2 = [3, 2]输出:false提示:树的节点原创 2022-05-10 10:32:44 · 220 阅读 · 0 评论 -
面试题 04.09. 二叉搜索树序列
题从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉搜索树 root,输出所有可能生成此树的数组。示例 1:输入: root = [2,1,3]输出: [[2,1,3],[2,3,1]]解释: 数组 [2,1,3]、[2,3,1] 均可以通过从左向右遍历元素插入树中形成以下二叉搜索树2/ \1 3示例 2:输入: root = [4,1,null,null,3,2]输出: [[4,1,3,2]]提示:二叉搜索树中的节原创 2022-05-09 12:46:16 · 299 阅读 · 0 评论 -
面试题 04.08. 首个共同祖先
题设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]3/ 5 1/ \ / 6 2 0 8/ 7 4示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1 的最近公共祖先是节点 3。示例 2:原创 2022-05-08 12:04:37 · 138 阅读 · 0 评论 -
面试题 04.06. 后继者
题面试题 04.06. 后继者设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。示例 1:输入: root = [2,1,3], p = 12/ 1 3输出: 2示例 2:输入: root = [5,3,6,2,4,null,null,1], p = 6 5 / \3 6/ 2 4/1输出: null解题思路重点 if (p != root&&p->v原创 2022-05-08 11:20:44 · 125 阅读 · 0 评论 -
面试题 04.05. 合法二叉搜索树
题面试题 04.05. 合法二叉搜索树实现一个函数,检查一棵二叉树是否为二叉搜索树。示例 1:输入:2/ 1 3输出: true示例 2:输入:5/ 1 4/ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。解题思路题解代码class Solution{ TreeNode *pre;public: bool isValidBST(TreeNode原创 2022-05-07 17:11:56 · 233 阅读 · 0 评论 -
面试题 04.04. 检查平衡性
题面试题 04.04. 检查平衡性实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。示例 1:给定二叉树 [3,9,20,null,null,15,7]3/ 9 20/ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4]1/ 2 2/ 3 3/ 4 4返回 false 。代码class Solution{public: boo原创 2022-05-07 16:23:06 · 287 阅读 · 0 评论 -
面试题 04.03. 特定深度节点链表
题面试题 04.03. 特定深度节点链表给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。示例:输入:[1,2,3,4,5,null,7,8] 1 / \ 2 3 / \ \ 4 5 7/8输出:[[1],[2,3],[4,5,7],[8]]解题思路使用一个 nextStart 来记录每一层的开始节点代码class Solution{原创 2022-05-05 13:43:11 · 165 阅读 · 0 评论 -
面试题 04.02. 最小高度树
题给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-height-tree-lcci著作权原创 2022-04-26 13:16:26 · 121 阅读 · 0 评论 -
深搜广搜区别 面试题 04.01. 节点间通路
题面试题 04.01. 节点间通路节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。示例1:输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2输出:true示例2:输入:n = 5, graph = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4], [1, 3], [2, 3], [3, 4]], start =原创 2022-04-24 13:39:19 · 493 阅读 · 0 评论 -
面试题 03.05. 栈排序
题栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。示例1:输入:[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”][[], [1], [2], [], [], []]输出:[null,null,null,1,null,2]示例2:输入:[“Sort原创 2022-04-19 10:51:42 · 100 阅读 · 0 评论 -
面试题 03.04. 化栈为队
题实现一个MyQueue类,该类用两个栈来实现一个队列。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false说明:你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size 和 is empty 操作是合法的。你所使用的语言也原创 2022-04-19 10:33:31 · 137 阅读 · 0 评论 -
面试题 03.03. 堆盘子
题面试题 03.03. 堆盘子堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。 进阶:实现一个popAt(int index)方法,根据指定的子栈,执行po原创 2022-04-18 16:08:55 · 112 阅读 · 0 评论 -
面试题 03.02. 栈的最小值
题面试题 03.02. 栈的最小值请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(); --> 返回 -3.minStack.pop();minStack原创 2022-04-18 14:35:26 · 221 阅读 · 0 评论 -
面试题 03.01. 三合一
面试题 03.01. 三合一三合一。描述如何只用一个数组来实现三个栈。你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。构造函数会传入一个stackSize参数,代表每个栈的大小。示例1:输入:[“TripleInOne”, “push”, “push”, “pop”, “pop”, “pop”, “isEmpty”][[1], [0, 1]原创 2022-04-16 11:36:26 · 126 阅读 · 0 评论 -
面试题 02.08. 环路检测
题面试题 02.08. 环路检测给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。若环不存在,请返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail原创 2022-04-14 12:57:04 · 136 阅读 · 0 评论 -
面试题 02.07. 链表相交
题https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/解题思路此处撰写解题思路大佬题解代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */c原创 2022-04-07 17:02:48 · 1106 阅读 · 0 评论 -
面试题 02.06. 回文链表
题编写一个函数,检查输入的链表是否是回文的。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。解题思路三次循环求解代原创 2022-04-06 16:49:08 · 107 阅读 · 0 评论 -
面试题 02.05. 链表求和
题面试题 02.05. 链表求和给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?示例:输入:(6 -> 1 -> 7) + (2 -> 9 -> 5)原创 2022-04-06 14:10:13 · 171 阅读 · 0 评论 -
面试题 02.04. 分割链表
题给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你不需要 保留 每个分区中各节点的初始相对位置。示例 1:输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]示例 2:输入:head = [2,1], x = 2输出:[1,2]提示:链表中节点的数目在范围 [0, 200] 内-100 <= Node.val <= 100-200 <=原创 2022-04-06 13:14:41 · 127 阅读 · 0 评论 -
二进制表示中质数个计算置位
题二进制表示中质数个计算置位给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数。计算置位位数 就是二进制表示中 1 的个数。例如, 21 的二进制表示 10101 有 3 个计算置位。示例 1:输入:left = 6, right = 10输出:4解释:6 -> 110 (2 个计算置位,2 是质数)7 -> 111 (3 个计算置位,3 是质数)9 -> 1001 (2 个计算置位,原创 2022-04-05 17:39:54 · 209 阅读 · 0 评论 -
面试题 02.02. 返回倒数第 k 个节点
题实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。注意:本题相对原题稍作改动示例:输入: 1->2->3->4->5 和 k = 2输出: 4说明:给定的 k 保证是有效的。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路先进行遍历知道长度,在遍历输出len-k原创 2022-03-29 14:05:37 · 573 阅读 · 0 评论 -
面试题 02.01. 移除重复节点
题编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci著作权归领扣网络所有。商业转载请联系官方授权,非商业原创 2022-03-29 13:33:52 · 208 阅读 · 0 评论 -
面试题 01.07. 旋转矩阵
面试题 01.07. 旋转矩阵给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?示例 1:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例 2:给定 matrix =[[ 5, 1, 9,11],[ 2, 4, 8,10],[13, 3, 6, 7],[15,14,12原创 2022-03-28 13:34:13 · 405 阅读 · 0 评论 -
面试题 01.02. 判定是否互为字符重排
面试题 01.02. 判定是否互为字符重排给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。示例 1:输入: s1 = “abc”, s2 = “bca”输出: true示例 2:输入: s1 = “abc”, s2 = “bad”输出: false说明:0 <= len(s1) <= 1000 <= len(s2) <= 100解ascii最大值是255 使用int数组应该是最优解fun CheckP原创 2022-03-27 12:17:55 · 598 阅读 · 0 评论