程序员面试金典
主要是对该书中习题的整理总结,方便自己以及别人对于书中算法题的学习
pfco
弱小和无知不是生存的障碍,傲慢才是
展开
-
面试题 16.20. T9键盘
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射如下图所示:示例 1:输入: num = "8733", words = ["tree", "used"]输出: ["tree", "used"]示例 2:输入: num = "2", words = ["a", "原创 2021-06-07 22:41:22 · 106 阅读 · 0 评论 -
面试题 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,原创 2021-06-06 21:43:49 · 52 阅读 · 0 评论 -
面试题 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]]原创 2021-06-02 19:33:38 · 73 阅读 · 0 评论 -
面试题 08.07. 无重复字符串的排列组合
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。示例1: 输入:S = "qwe" 输出:["qwe", "qew", "wqe", "weq", "ewq", "eqw"]示例2: 输入:S = "ab" 输出:["ab", "ba"]提示:字符都是英文字母。字符串长度在[1, 9]之间。题目链接题目分析这道题是比较经典的全排列问题,首先确定原创 2021-06-01 23:18:58 · 221 阅读 · 1 评论 -
面试题 08.09. 括号
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。说明:解集不能包含重复的子集。例如,给出 n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]题目链接题目分析这道题是暴搜类型的题目,对于暴搜需要明确枚举的顺序,这里我们以当前位置放上面括号来枚举所有的情况,中间需要判断几个非法情况,第原创 2021-05-31 23:44:07 · 85 阅读 · 1 评论 -
面试题 08.04. 幂集
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。说明:解集不能包含重复的子集。示例: 输入: nums = [1,2,3] 输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]题目链接题目分析这个问题是一个比较经典的问题,我个人比较喜欢使用二进制枚举来做,对于二进制枚举大致的含义就是将集合中每一原创 2021-05-30 17:13:53 · 101 阅读 · 0 评论 -
面试题 02.06. 回文链表
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述编写一个函数,检查输入的链表是否是回文的。示例 1:输入: 1->2输出: false 示例 2:输入: 1->2->2->1输出: true 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?题目链接题目分析这道题是判断回文与反转链表的一个结合,思路是首先通过快慢指针获取到链表的中点,之后将后半段反转,然后与前半段进行值的比较,如果都一样,原创 2021-05-24 00:02:59 · 61 阅读 · 0 评论 -
面试题 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),原创 2021-05-22 20:36:24 · 96 阅读 · 1 评论 -
面试题 16.15. 珠玑妙算
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述珠玑妙算游戏(the game of master mind)的玩法如下。计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜原创 2021-05-22 01:19:58 · 195 阅读 · 3 评论 -
面试题 05.06. 整数转换
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。示例1: 输入:A = 29 (或者0b11101), B = 15(或者0b01111) 输出:2示例2: 输入:A = 1,B = 2 输出:2提示:A,B范围在[-2147483648, 2147483647]之间题目链接题目分析看到要找到两个数字不同的位,首先想到的自然是异或运算,那么统计一个数字中1的个数其实是原创 2021-05-20 23:42:08 · 104 阅读 · 0 评论 -
面试题 16.11. 跳水板
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。示例 1输入:shorter = 1longer = 2k = 3输出: [3,4,5,6]解释:可以使用 3 次 shorter,得到结果 3;使用 2 次 shorter 和 1 次原创 2021-05-19 23:21:05 · 53 阅读 · 2 评论 -
面试题 17.16. 按摩师
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 2:输入: [2,7,9,3,1]输出原创 2021-05-19 00:11:05 · 211 阅读 · 2 评论 -
面试题 17.10. 主要元素
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。示例 1:输入:[1,2,5,9,5,9,5,5,5]输出:5示例 2:输入:[3,2]输出:-1示例 3:输入:[2,2,1,1,1,2,2]输出:2说明:你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗?题目链接题目分析这道题要找到出现次数大于n / 2的那个数字原创 2021-05-17 22:51:41 · 87 阅读 · 0 评论 -
面试题 03.01. 三合一
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述三合一。描述如何只用一个数组来实现三个栈。你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。构造函数会传入一个stackSize参数,代表每个栈的大小。示例1: 输入:["TripleInOne", "push", "push", "pop", "pop原创 2021-05-05 22:15:23 · 98 阅读 · 0 评论 -
面试题 10.01. 合并排序的数组
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述题目链接题目分析解题代码JavaGo原创 2021-05-04 22:28:48 · 69 阅读 · 0 评论 -
面试题 10.05. 稀疏数组搜索
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。示例1: 输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta" 输出:-1 说明: 不存在返回-1。示例2: 输入:words = ["at", "", "", "", "ball", "原创 2021-05-03 23:02:04 · 54 阅读 · 0 评论 -
面试题 01.04. 回文排列
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例1:输入:"tactcoa"输出:true(排列有"tacocat"、"atcocta",等等)题目链接题目分析这道题要求我们判断给定的字符串是否可以重新排列为一个回文序列,回文序列的要求是奇数字符的数量为1个或者0个,所以我们就可以直接原创 2021-04-22 12:49:08 · 69 阅读 · 0 评论 -
面试题 01.09. 字符串轮转
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。示例1: 输入:s1 = "waterbottle", s2 = "erbottlewat" 输出:True示例2: 输入:s1 = "aa", s2 = "aba" 输出:False提示:字符串长度在[0, 100000]范围内。说明:你能原创 2021-04-11 11:24:02 · 67 阅读 · 1 评论 -
面试题 08.10. 颜色填充
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的行坐标为 sr 列坐标为 sc。需要填充的新颜色为 newColor 。「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的若干元素。请用新颜色填充初始坐标点的周围区域,并返回填充后的图像。示例:输入:image = [[1,1,1],[1,1,0],[1,0,1原创 2021-04-11 11:10:01 · 106 阅读 · 0 评论 -
面试题 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原创 2021-04-09 20:22:04 · 57 阅读 · 0 评论 -
面试题 03.06. 动物收容所
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或者可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构,实现各种操作方法,比如enqueue、dequeueAny、dequeueDog和dequeueCat。允许使用Java内置原创 2021-04-08 16:04:54 · 147 阅读 · 0 评论 -
面试题 01.03. URL化
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)示例 1:输入:"Mr John Smith ", 13输出:"Mr%20John%20Smith"示例 2:输入:" ", 5输出:"%20%20%20%20%20"原创 2021-04-08 10:15:48 · 50 阅读 · 0 评论 -
面试题 17.01. 不用加号的加法
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。示例:输入: a = 1, b = 1输出: 2提示:a, b 均可能是负数或 0结果不会溢出 32 位整数题目链接题目分析这道题不让使用+,-,*,/来完成数字的加法运算,一般就是使用位运算来做了,那么如何使用位运算来做呢,我们可以从两个数字的二进制表示入手,首先异或运算指的就是二进制表示下不进位的加法,所谓的不进位指的就是当两原创 2021-04-07 17:06:19 · 135 阅读 · 4 评论 -
面试题 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(); --> 返回原创 2021-04-06 11:41:19 · 69 阅读 · 0 评论 -
面试题 17.12. BiNode
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求依然符合二叉搜索树的性质,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。返回转换后的单向链表的头节点。注意:本题相对原题稍作改动示例:输入: [4,2,5,1,3,null,6,0]输出: [0,null,1,null,2,null,3,null,4,n原创 2021-04-03 20:58:31 · 87 阅读 · 1 评论 -
面试题 17.04. 消失的数字
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?注意:本题相对书上原题稍作改动示例 1:输入:[3,0,1]输出:2示例 2:输入:[9,6,4,2,3,5,7,0,1]输出:8题目链接题目分析这道题要求我用O(n)O(n)O(n)的时间复杂度来做,由于题目中已经明确告诉了数字范围,所以我们可以直接求出0-n的所有数字的和,然原创 2021-04-03 20:28:10 · 108 阅读 · 1 评论 -
面试题 08.06. 汉诺塔问题
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:(1) 每次只能移动一个盘子;(2) 盘子只能从柱子顶端滑出移到下一根柱子;(3) 盘子只能叠在比它大的盘子上。请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。你需要原地修改栈。示例1:输入:原创 2021-04-01 18:13:40 · 192 阅读 · 0 评论 -
面试题 08.03. 魔术索引
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。示例1: 输入:nums = [0, 2, 3, 4, 5] 输出:0 说明: 0下标的元素为0示例2: 输入:nums = [1, 1, 1] 输出:1说明:nu原创 2021-03-31 13:13:06 · 60 阅读 · 0 评论 -
面试题 02.01. 移除重复节点
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例一: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3]示例二: 输入:[1, 1, 1, 1, 2] 输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。题目链接题目分析首先链表是无序的,如果有序的话,又是另外的一种解决思路,那么如果链表无序,还要去重,原创 2021-03-30 21:20:31 · 56 阅读 · 0 评论 -
面试题 02.07. 链表相交
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。示例一:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference o原创 2021-03-29 20:39:40 · 161 阅读 · 1 评论 -
面试题 05.07. 配对交换
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。示例1: 输入:num = 2(或者0b10) 输出 1 (或者 0b01)示例2: 输入:num = 3 输出:3提示:num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。题目链接题目分析我的思路是先分析题目中数字的范围,最大为32位,所以我只需要枚原创 2021-03-28 21:45:46 · 91 阅读 · 2 评论 -
面试题 03.04. 化栈为队
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述实现一个MyQueue类,该类用两个栈来实现一个队列。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false说明:你只能使用标准的栈操作 – 也就是只有 push to top, peek原创 2021-03-27 20:58:13 · 95 阅读 · 0 评论 -
面试题 01.01. 判定字符是否唯一
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例1:输入: s = "leetcode"输出: false 示例2:输入: s = "abc"输出: true限制:0<=len(s)<=1000 <= len(s) <= 1000<=len(s)<=100如果你不使用额外的数据结构,会很加分。题目链接题目分析这道题直观的思路就是我们可原创 2021-03-26 20:46:33 · 55 阅读 · 0 评论 -
面试题 16.07. 最大数值
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。示例:输入: a = 1, b = 2输出: 2题目链接题目分析题目中要求我们不可以使用任何的比较运算,所以自然而然想到可以使用位运算来解决,首先说我个人的思路,题目中数字的范围都在int范围内,首先如果两个数字符号不同,则直接返回正数,如果相同的话,那么int的最高位为31,从最高位开始枚举,谁的最高位先有1,则原创 2021-03-26 10:39:25 · 128 阅读 · 4 评论 -
面试题 02.02. 返回倒数第 k 个节点
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。注意:本题相对原题稍作改动示例:输入: 1->2->3->4->5 和 k = 2输出: 4说明:给定的 k 保证是有效的。题目分析这道题有多种思路,且时间复杂度都是O(n),那么最终最优解的优化必然是在时间上常数级的优化以及空间上的优化,在时间上我们可以尽可能的遍历链表少一些,而在空间上我们可以做到O(1),原创 2021-03-25 09:38:42 · 87 阅读 · 2 评论 -
面试题 04.02. 最小高度树
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 题目分析这道题要求的是一原创 2021-03-24 18:03:19 · 195 阅读 · 0 评论 -
面试题 02.03. 删除中间节点
本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出题目描述实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。示例:输入:单向链表a->b->c->d->e->f中的节点c结果:不返回任何数据,但该链表变为a->b->d->e->f题目链接题目分析首先删除单向链表的某一个节点按照常规的思路就是先找到某个节点的前一个节点node,之后node.next = node原创 2021-03-24 10:04:59 · 70 阅读 · 0 评论