程序员面试金典(第6版)
cyan_color
这个作者很懒,什么都没留下…
展开
-
漫画算法第四章
快速排序算法 双边循环法 单边循环法原创 2021-07-15 22:43:27 · 92 阅读 · 0 评论 -
漫画算法第五章
如何判断链表有环 /** * 判断是否有环 * @param head 链表头节点 */ public static Boolean isCycle(Node head){ Node fast = head; Node slow = head; while(fast!=null&&fast.next!=null){ fast = fast.next.next; slow = slow.next; if(fast==slow){ return tr原创 2021-07-15 20:45:12 · 80 阅读 · 0 评论 -
面试题 04.08. 首个共同祖先
设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。 说明: 所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉树中。 class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { List<TreeNode> pPath = new ArrayList原创 2021-07-01 11:20:13 · 60 阅读 · 0 评论 -
面试题 04.06. 后继者
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点没有对应的“下一个”节点,则返回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 6 / 2 4 / 1 输出: null class Solution { boolean find = false; public Tre原创 2021-07-01 10:49:52 · 76 阅读 · 0 评论 -
面试题 04.05. 合法二叉搜索树
实现一个函数,检查一棵二叉树是否为二叉搜索树。 示例 1: 输入: 2 / 1 3 输出: true 示例 2: 输入: 5 / 1 4 / 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode l原创 2021-07-01 10:36:42 · 81 阅读 · 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 / 3 3 / 4 4 返回 false 。 题解 这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是原创 2021-07-01 10:33:23 · 65 阅读 · 0 评论 -
面试题 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 = 0, target = 4 输出原创 2021-07-01 09:41:33 · 75 阅读 · 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]] /** * Definition for a binary tree node. * public class TreeNode {原创 2021-07-01 09:28:22 · 88 阅读 · 0 评论 -
面试题 04.02. 最小高度树
面试题 04.02. 最小高度树 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 /** * Definition for a binary tree node. * public class Tre原创 2021-07-01 09:28:08 · 52 阅读 · 0 评论 -
面试题 03.06. 动物收容所
动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或者可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构,实现各种操作方法,比如enqueue、dequeueAny、dequeueDog和dequeueCat。允许使用Java内置的LinkedList数据结构。 enqueue方法有一个animal参数,animal[0]原创 2021-07-01 09:27:41 · 85 阅读 · 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: 输入: [“Sor原创 2021-07-01 09:27:24 · 67 阅读 · 0 评论 -
面试题 03.04. 化栈为队
实现一个MyQueue类,该类用两个栈来实现一个队列。 示例: MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false 说明: 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size 和 isempty 操作是合法的。 你所使用的语言也许原创 2021-06-30 15:15:00 · 51 阅读 · 0 评论 -
面试题 03.03. 堆盘子
堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。 进阶:实现一个popAt(int index)方法,根据指定的子栈,执行pop操作。 当某个栈为空时,应当删除原创 2021-07-01 09:27:01 · 54 阅读 · 0 评论 -
面试题 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.top(); -->原创 2021-06-30 14:29:59 · 54 阅读 · 0 评论 -
面试题 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], [0, 2], [0],原创 2021-06-30 14:25:14 · 61 阅读 · 0 评论 -
面试题 02.08. 环路检测
给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中原创 2021-06-30 13:13:39 · 55 阅读 · 0 评论 -
面试题 02.07. 链表相交
给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,原创 2021-06-30 13:08:54 · 54 阅读 · 0 评论 -
面试题 02.06. 回文链表
编写一个函数,检查输入的链表是否是回文的。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(i原创 2021-06-30 13:06:26 · 44 阅读 · 0 评论 -
面试题 02.05. 链表求和
给定两个用链表表示的整数,每个节点包含一个数位。 这些数位是反向存放的,也就是个位排在链表首部。 编写函数对这两个整数求和,并用链表形式返回结果。 示例: 输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295 输出:2 -> 1 -> 9,即912 进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢? 示例: 输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295 输出:原创 2021-06-30 13:02:03 · 51 阅读 · 0 评论 -
面试题 02.04. 分割链表
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。 示例: 输入: head = 3->5->8->5->10->2->1, x = 5 输出: 3->1->2->10->5->5->8 /** * Definition for singly-linked原创 2021-06-30 11:55:38 · 48 阅读 · 0 评论 -
面试题 02.03. 删除中间节点
若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如,传入节点 c(位于单向链表 a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f 示例: 输入:节点 5 (位于单向链表 4->5->1->9 中) 输出:不返回任何数据,从链表中删除传入的节点 5,使链表变为 4->1-&g原创 2021-06-30 11:55:27 · 58 阅读 · 0 评论 -
面试题 02.02. 返回倒数第 k 个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 k = 2 输出: 4 说明: 给定的 k 保证是有效的。 快慢指针 class Solution { public int kthToLast(ListNode head, int k) { ListNode first = head; ListNode secound = head;原创 2021-06-30 11:55:05 · 56 阅读 · 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]范围内。 进阶: 如果不得使用临时缓冲区,该怎么解决? /** * Definition for singly-linked list. * public class ListNode { * int原创 2021-06-29 21:44:38 · 50 阅读 · 0 评论 -
面试题 01.09. 字符串轮转
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。 示例1: 输入:s1 = “waterbottle”, s2 = “erbottlewat” 输出:True 示例2: 输入:s1 = “aa”, s2 = “aba” 输出:False 提示: 字符串长度在[0, 100000]范围内。 说明: 你能只调用一次检查子串的方法吗? class Solution { public boolean原创 2021-06-29 21:33:16 · 45 阅读 · 0 评论 -
面试题 01.08. 零矩阵
编写一种算法,若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], [0,4,5,0], [0,3,1,0] ] class Solution { public void setZeroes(int[][] matri原创 2021-06-29 21:30:05 · 65 阅读 · 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, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16] ], 原地旋转输原创 2021-06-29 21:27:19 · 57 阅读 · 0 评论 -
面试题 01.06. 字符串压缩
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。 示例1: 输入:“aabcccccaaa” 输出:“a2b1c5a3” 示例2: 输入:“abbccd” 输出:“abbccd” 解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。 提示: 字符串长度在[0, 50000]范围内。 class原创 2021-06-29 21:25:51 · 58 阅读 · 0 评论 -
面试题 01.05. 一次编辑
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。 示例 1: 输入: first = “pale” second = “ple” 输出: True 示例 2: 输入: first = “pales” second = “pal” 输出: False class Solution { public boolean oneEditAway(String first, String second) {原创 2021-06-29 21:17:33 · 53 阅读 · 0 评论 -
面试题 01.04. 回文排列
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。 回文串不一定是字典当中的单词。 示例1: 输入:“tactcoa” 输出:true(排列有"tacocat"、“atcocta”,等等) 统计各字符出现的次数,为奇数次的次数不能超过1次 class Solution { public boolean canPermutePalindrome(String s) { Map<Characte原创 2021-06-29 20:48:54 · 59 阅读 · 0 评论 -
面试题 01.03. URL化
URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。) 示例 1: 输入:"Mr John Smith ", 13 输出:“Mr%20John%20Smith” 示例 2: 输入:" “, 5 输出:”%20%20%20%20%20" 提示: 字符串长度在 [0, 500000] 范围内。 class Solution原创 2021-06-29 20:40:09 · 47 阅读 · 0 评论 -
面试题 01.02. 判定是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 https://leetcode-cn.com/problems/check-permutation-lcci/ 示例 1: 输入: s1 = “abc”, s2 = “bca” 输出: true 示例 2: 输入: s1 = “abc”, s2 = “bad” 输出: false 说明: 0 <= len(s1) <= 100 0 <= len(s2) <= 10原创 2021-06-29 20:30:44 · 96 阅读 · 0 评论 -
面试题 01.01. 判定字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 https://leetcode-cn.com/problems/is-unique-lcci/ 示例 1: 输入: s = “leetcode” 输出: false 示例 2: 输入: s = “abc” 输出: true 限制: 0 <= len(s) <= 100 如果你不使用额外的数据结构,会很加分。 1.使用HashSet class Solution { public boolean isUnique(S原创 2021-06-29 20:18:27 · 68 阅读 · 0 评论