程序员面试金典
LeetCode-【程序员面试金典】
博_采_众_长
理论与实践并行!
展开
-
【程序员面试金典】01.01. 判定字符是否唯一
1.题目实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例 1:输入: s = "leetcode"输出: false 示例 2:输入: s = "abc"输出: true限制:0 <= len(s) <= 100如果你不使用额外的数据结构,会很加分。来源:力扣(LeetCode)链接:https://leetcode-cn.com/pro...原创 2020-04-09 18:37:33 · 206 阅读 · 0 评论 -
【程序员面试金典】01.02. 判定是否互为字符重排
1.题目给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。示例 1:输入: s1 = "abc", s2 = "bca"输出: true 示例 2:输入: s1 = "abc", s2 = "bad"输出: false说明:0 <= len(s1) <= 1000 <= len(s2) <= ...原创 2020-04-09 18:44:39 · 120 阅读 · 0 评论 -
【程序员面试金典】01.03. URL化
1.题目URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)示例1: 输入:"Mr John Smith ", 13 输出:"Mr%20John%20Smith"示例2: 输入:" ", 5 输出:"...原创 2020-04-09 18:56:48 · 134 阅读 · 0 评论 -
【程序员面试金典】01.04. 回文排列
1.题目给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例1:输入:"tactcoa"输出:true(排列有"tacocat"、"atcocta",等等)来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palind...原创 2020-04-11 17:24:44 · 136 阅读 · 0 评论 -
【程序员面试金典】01.05. 一次编辑
1.题目字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。示例 1:输入: first = "pale"second = "ple"输出: True 示例 2:输入: first = "pales"second = "pal"输出: False来源:力扣(LeetCode)...原创 2020-04-08 21:20:48 · 167 阅读 · 0 评论 -
【程序员面试金典】 01.07. 旋转矩阵
1. 题目给定一幅由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 =[ ...原创 2020-04-07 13:11:07 · 668 阅读 · 3 评论 -
【程序员面试金典】 01.08. 零矩阵
1. 题目编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。示例 1:输入:[ [1,1,1], [1,0,1], [1,1,1]]输出:[ [1,0,1], [0,0,0], [1,0,1]]示例 2:输入:[ [0,1,2,0], [3,4,5,2], [1,3,1,5]]输出:[ [0,0,0,0],...原创 2020-04-07 19:46:31 · 234 阅读 · 0 评论 -
【程序员面试金典】01.09. 字符串轮转
1.题目字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。示例1: 输入:s1 = "waterbottle", s2 = "erbottlewat" 输出:True示例2: 输入:s1 = "aa", "aba" 输出:False提示:字符串长度在[0, 100000]范围内。...原创 2020-04-21 20:53:04 · 183 阅读 · 0 评论 -
【程序员面试金典】02.01. 移除重复节点(set)
1.题目编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3]示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。进阶:如果不得使用临时缓冲区,该怎么解决?来源:力扣(LeetCod...原创 2020-04-22 08:46:12 · 158 阅读 · 0 评论 -
【程序员面试金典】02.02. 返回倒数第 k 个节点(快慢指针)
1.题目实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。注意:本题相对原题稍作改动示例:输入: 1->2->3->4->5 和 k = 2输出: 4说明:给定的 k 保证是有效的。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-l...原创 2020-04-24 08:24:39 · 169 阅读 · 0 评论 -
【程序员面试金典】02.03. 删除中间节点(搞不懂)
1.题目实现一种算法,删除单向链表中间的某个节点(除了第一个和最后一个节点,不一定是中间节点),假定你只能访问该节点。示例:输入:单向链表a->b->c->d->e->f中的节点c结果:不返回任何数据,但该链表变为a->b->d->e->f2.题解真是不知道什么人写的问题,着实令人头大,不知道题目到底要干啥!class Sol...原创 2020-04-25 13:36:59 · 147 阅读 · 0 评论 -
【程序员面试金典】02.04. 分割链表
1. 题目编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。输入: head = 3->5->8->5->10->2->1, x = 5输出: 3->1->2->1...原创 2020-04-08 21:00:11 · 190 阅读 · 0 评论 -
【程序员面试金典】02.05. 链表求和
1.题目给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912进阶:假设这些数位是正向存放的,请再做一遍。示例:输入:(6...原创 2020-04-09 08:08:37 · 218 阅读 · 1 评论 -
【程序员面试金典】 02.06. 回文链表(快慢指针+头插法建表)
1.题目编写一个函数,检查输入的链表是否是回文的。示例 1:输入: 1->2输出: false 示例 2:输入: 1->2->2->1输出: true 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindro...原创 2020-04-25 15:52:08 · 1045 阅读 · 0 评论 -
【程序员面试金典】02.07. 链表相交(双指针)
1.题目给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = ...原创 2020-04-25 21:11:59 · 162 阅读 · 0 评论 -
【程序员面试金典】02.08. 环路检测
1.题目给定一个有环链表,实现一个算法返回环路的开头节点。有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], po...原创 2020-04-10 08:29:38 · 190 阅读 · 0 评论 -
【程序员面试金典】03.01. 三合一
1.题目三合一。描述如何只用一个数组来实现三个栈。你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。构造函数会传入一个stackSize参数,代表每个栈的大小。示例1: 输入:["TripleInOne", "push", "pus...原创 2020-04-25 21:29:36 · 155 阅读 · 0 评论 -
【程序员面试金典】03.02. 栈的最小值(双栈)
1.题目请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(...原创 2020-04-29 12:55:17 · 149 阅读 · 0 评论 -
【程序员面试金典】03.03. 堆盘子
1.题目堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情...原创 2020-04-10 09:29:07 · 123 阅读 · 0 评论 -
【程序员面试金典】 03.04. 化栈为队(双栈)
1.题目实现一个MyQueue类,该类用两个栈来实现一个队列。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2);`在这里插入代码片`queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false说明:你只能使用标准的栈操作...原创 2020-05-01 15:32:04 · 139 阅读 · 0 评论 -
【程序员面试金典】 03.05. 栈排序
1.题目栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。示例1: 输入:["SortedStack", "push", "push", "peek", "pop", "peek"][[], [1], [...原创 2020-04-11 17:09:51 · 140 阅读 · 0 评论 -
【程序员面试金典】 03.06. 动物收容所(双队列)
1.题目动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或者可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构,实现各种操作方法,比如enqueue、dequeueAny、dequeueDog和dequeue...原创 2020-05-01 15:52:34 · 232 阅读 · 0 评论 -
【程序员面试金典】 04.02. 最小高度树(递归)
1.题目给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 ...原创 2020-05-01 16:15:26 · 139 阅读 · 0 评论 -
【程序员面试金典】04.03. 特定深度节点链表(bfs+链表)
1.题目给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。示例:输入:[1,2,3,4,5,null,7,8] 1 / \ 2 3 / \ \ 4 5 7 / 8输出:[[1],[2,3...原创 2020-04-22 08:58:07 · 189 阅读 · 0 评论 -
【程序员面试金典】04.04. 检查平衡性
1.题目实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 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 / ...原创 2020-05-01 16:47:03 · 161 阅读 · 0 评论 -
【程序员面试金典】04.05. 合法二叉搜索树(递归或中序遍历)
1.题目实现一个函数,检查一棵二叉树是否为二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。来源:力扣(Le...原创 2020-04-22 10:43:54 · 153 阅读 · 0 评论 -
【程序员面试金典】04.06. 后继者(递归)
1.题目设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。示例 1:输入: root = [2,1,3], p = 1 2 / \1 3输出: 2示例 2:输入: root = [5,3,6,2,4,null,null,1], p = 6 5 / \ 3 ...原创 2020-05-01 20:39:59 · 146 阅读 · 0 评论 -
【程序员面试金典】05.01. 插入(位运算)
1.题目插入。给定两个32位的整数N与M,以及表示比特位置的i与j。编写一种方法,将M插入N,使得M从N的第j位开始,到第i位结束。假定从j位到i位足以容纳M,也即若M = 10 011,那么j和i之间至少可容纳5个位。例如,不可能出现j = 3和i = 2的情况,因为第3位和第2位之间放不下M。示例1: 输入:N = 10000000000, M = 10011, i = 2, j = ...原创 2020-05-02 09:09:09 · 168 阅读 · 0 评论 -
【程序员面试金典】05.03. 翻转数位(记录翻转前的位数)
1.题目给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。示例 1:输入: num = 1775(110111011112)输出: 8示例 2:输入: num = 7(01112)输出: 4来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-bits-...原创 2020-05-04 11:35:07 · 194 阅读 · 0 评论 -
【程序员面试金典】 05.06. 整数转换(异或运算)
1.题目整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。示例1: 输入:A = 29 (或者0b11101), B = 15(或者0b01111) 输出:2示例2: 输入:A = 1,B = 2 输出:2提示:A,B范围在[-2147483648, 2147483647]之间来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/convert-integer-lcci著作权归领扣网络所有。商业转载请联系官方原创 2020-05-14 09:01:55 · 370 阅读 · 0 评论 -
【程序员面试金典】 08.03. 魔术索引(二分递归)
1.题目魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。示例1: 输入:nums = [0, 2, 3, 4, 5] 输出:0 说明: 0下标的元素为0示例2: 输入:nums = [1, 1, 1]...原创 2020-04-30 17:43:40 · 221 阅读 · 0 评论 -
【程序员面试金典】 08.10. 颜色填充(DFS)
1.题目颜色填充。编写函数,实现许多图片编辑软件都支持的“颜色填充”功能。给定一个屏幕(以二维数组表示,元素为颜色值)、一个点和一个新的颜色值,将新颜色值填入这个点的周围区域,直到原来的颜色值全都改变。示例1: 输入:image = [[1,1,1],[1,1,0],[1,0,1]] sr = 1, sc = 1, newColor = 2 输出:[[2,2,2],[2,2,0],[...原创 2020-05-01 10:20:05 · 234 阅读 · 0 评论 -
【程序员面试金典】 08.06. 汉诺塔问题(经典递归)
1.题目在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:(1) 每次只能移动一个盘子;(2) 盘子只能从柱子顶端滑出移到下一根柱子;(3) 盘子只能叠在比它大的盘子上。请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。你需要原...原创 2020-04-30 19:33:59 · 324 阅读 · 0 评论 -
【程序员面试金典】 10.05. 稀疏数组搜索(二分法)
1.题目稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。示例1: 输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta" 输出:-1 说明: 不存在返回-1。示例2: 输入:words = ["at", "", ""...原创 2020-04-30 21:17:00 · 156 阅读 · 0 评论 -
【程序员面试金典】16.10. 生存人数(数组哈希)
1.题目给定N个人的出生年份和死亡年份,第i个人的出生年份为birth[i],死亡年份为death[i],实现一个方法以计算生存人数最多的年份。你可以假设所有人都出生于1900年至2000年(含1900和2000)之间。如果一个人在某一年的任意时期都处于生存状态,那么他们应该被纳入那一年的统计中。例如,生于1908年、死于1909年的人应当被列入1908年和1909年的计数。如果有多个年份生...原创 2020-04-21 20:15:22 · 5085 阅读 · 0 评论 -
【程序员面试金典】17.23. 最大黑方阵(动态规划)
1.题目给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出 4 条边皆为黑色像素的最大子方阵。返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和列号,size 是子方阵的边长。若有多个满足条件的子方阵,返回 r 最小的,若 r 相同,返回 c 最小的子方阵。若无满足条件的子方阵,返回空数组。示例 1:输入:[ [1,0,1], ...原创 2020-04-21 17:42:47 · 282 阅读 · 0 评论