
程序员面试金典
文章平均质量分 58
La vie est belle❤️
长长的路,慢慢地走
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode《程序员面试金典》面试题 08.10. 颜色填充
LeetCode 面试题 08.10. 颜色填充题目解题题目解题用的是深度优先搜索:// javascriptvar floodFill = function(image, sr, sc, newColor) { if (image[sr][sc] !== newColor) { // 如果颜色一致则不需要修改 paintImg(image, sr, sc, image[sr][sc], newColor); } return image;};va原创 2021-09-18 22:31:28 · 189 阅读 · 0 评论 -
LeetCode22 括号生成 &《程序员面试金典》面试题 08.09. 括号
LeetCode 面试题 08.09. 括号题目解题题目解题从头开始构造字符串,从而避免出现重复字符串。在这个解法中只要字符串仍然有效,逐一加入左括号和右括号。每次递归调用,都会有个索引值对应字符串的某个字符。我们需要选择左括号或右括号,那么,何时可以用左括号,何时可以用右括号呢?(1) 左括号:只要左括号还没有用完,就可以插入左括号。(2) 右括号:只要不造成语法错误,就可以插入右括号。何时会出现语法错误?如果右括号比左括号还多,就会出现语法错误。// javascriptvar gen原创 2021-09-18 22:25:04 · 146 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 08.08. 有重复字符串的排列组合
LeetCode 面试题 08.08. 有重复字符串的排列组合题目解题题目解题// javascriptvar permutation = function(S) { let map = buildMap(S), result = new Array(); getPerms(map, "", S.length, result); return result;};var buildMap = function(S) { let map = new Map()原创 2021-09-18 17:39:54 · 207 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 08.07. 无重复字符串的排列组合
LeetCode 面试题 08.07. 无重复字符串的排列组合题目解题解题一:从第 n-1 个字符的排列组合开始构造解题二:从 n-1 个字符的所有子序列的排列组合开始构建题目解题解题一:从第 n-1 个字符的排列组合开始构造// javascriptvar permutation = function(S) { let perms = new Array(); if (S.length === 0) { // 基线条件 perms.push("");原创 2021-09-18 11:17:49 · 212 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 08.06. 汉诺塔问题
LeetCode 面试题 08.06. 汉诺塔问题题目解题题目解题// javascriptvar hanota = function(A, B, C) { let n = A.length; moveDisks(n, A, B, C);};var moveDisks = function(n, A, B, C) { if (n < 1) return; moveDisks(n - 1, A, C, B); // 将A上面n-1个通过C移到B原创 2021-09-17 19:29:02 · 113 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 08.05. 递归乘法
LeetCode 面试题 08.05. 递归乘法题目解题解题一解题二解题三题目解题解题一// javascriptvar multiply = function(A, B) { let bigger = (A > B) ? A : B; let smaller = (A < B) ? A : B; return multiplyHelper(smaller, bigger);};var multiplyHelper = function(smaller原创 2021-09-17 17:05:11 · 124 阅读 · 0 评论 -
LeetCode78 子集 &《程序员面试金典》面试题 08.04. 幂集
122原创 2021-09-01 17:21:33 · 165 阅读 · 1 评论 -
LeetCode《程序员面试金典》面试题 08.03. 魔术索引
LeetCode 面试题 08.03. 魔术索引题目解题解题一:线性搜索 + 剪枝解题二:二分查找 + 剪枝题目注意点:有序整数数组可能存在多个魔术索引数组可能包含重复元素解题解题一:线性搜索 + 剪枝不过,既然给定数组是有序的,我们理应充分利用这个条件。// javascriptvar findMagicIndex = function(nums) { let i = 0; while (i < nums.length) { if (i =原创 2021-08-31 10:43:46 · 273 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 08.02. 迷路的机器人
LeetCode 面试题 08.02. 迷路的机器人题目解题解题一:DFS + 剪枝解题二:回溯法解题三:动态规划题目解题解题一:DFS + 剪枝// javascriptvar pathWithObstacles = function(obstacleGrid) { if (obstacleGrid.length === 0 || obstacleGrid[0].length === 0) return []; let path = []; if (getPath(o原创 2021-08-28 19:51:07 · 252 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 08.01. 三步问题
LeetCode 面试题 08.01. 三步问题题目解题解题一:自上而下递归+制表法解题二:自下而上解题三:矩阵快速幂题目题目中给了两个提示:一是取模,二是 n 的范围。解题解题一:自上而下递归+制表法前一个算法,对同一数值,countWays 会调用多次,而这显然是无用功。我们可以利用制表法加以修正。具体做法是,如果计算过 nnn 的值,再次遇到 nnn 就返回缓存值。每次计算一个新值,就把它添加到缓存中。// javascriptvar waysToStep = function(原创 2021-08-27 13:40:16 · 269 阅读 · 0 评论 -
LeetCode437 路径总和 III &《程序员面试金典》面试题 04.12. 求和路径
LeetCode 面试题 04.12. 求和路径题目解题解题一:蛮力法解题二:优化算法题目路径不一定非得从二叉树的根节点或叶节点开始或结束但是其方向必须向下 (只能从父节点指向子节点方向) 且 路径是连续的解题解题一:蛮力法在蛮力法中,我们只需查看所有可能的路径。为此,遍历每个节点,对于每个节点,用递归法尝试所有向下的路径,并随着递归的进行跟踪路径的和。每当得到目标和,将发现的路径数目加一。// javascriptvar pathSum = function(root, sum) {原创 2021-08-21 18:20:01 · 249 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 04.10. 检查子树
LeetCode 面试题 04.10. 检查子树题目解题解题一解题二比较讨论题目需要注意的是,需要比较的是节点值,而不是节点的地址。题目问的是 t1 中是否存在一个和 t2 结构数值一样的子树,而不是 t2 是不是 t1 的子树。解题解题一// javascriptvar checkSubTree = function(t1, t2) { let arr1 = [], arr2 = []; getOrderArray(t1, arr1); getOrderArray原创 2021-08-17 16:57:38 · 151 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 04.09. 二叉搜索树序列
LeetCode 面试题 04.09. 二叉搜索树序列题目解题解题一:自上而下 广度优先搜索解题二:自下而上 编织法题目解题解题一:自上而下 广度优先搜索「每一个节点都必须排在它的子孙结点前面」 进行了举例说明,参考 配图,回溯模板,详细注释 介绍的回溯三部曲:// javascriptlet ans;var BSTSequences = function(root) { ans = []; let path = []; // 如果 root = null原创 2021-08-17 12:43:47 · 198 阅读 · 0 评论 -
LeetCode236 & 剑指Offer 68 - II 二叉树的最近公共祖先 &《程序员面试金典》面试题 04.08. 首个共同祖先
LeetCode 面试题 04.08. 首个共同祖先题目解题解题一解题二题目解题所有节点的值都是唯一的。p、q 为不同节点且均存在于给定的二叉树中。以上两个限制可以简化求解:减少特殊情况的判断处理。解题一解题二...原创 2021-08-10 22:15:59 · 350 阅读 · 1 评论 -
LeetCode《程序员面试金典》面试题 04.06. 后继者
LeetCode 面试题 04.06. 后继者题目解题解法一:一般树+非递归中序遍历解法二:一般树+递归中序遍历解法三:二叉树+非递归中序遍历解法四:二叉树+递归中序遍历解法五:一般树+Morris算法中序遍历题目解题如果运用 二叉搜索树 的特性:左子节点(如有)的值 < 根节点的值 < 右子节点(如有)的值,且左子树的所有节点值 < 根节点的值,右子树的所有节点值 > 根节点的值,可以更高效地找到中序后继节点。在运用二叉搜索树特性之前,我们先从一般树来着手,直接进行中序遍原创 2021-08-09 17:21:26 · 296 阅读 · 0 评论 -
LeetCode98 验证二叉搜索树 &《程序员面试金典》面试题 04.05. 合法二叉搜索树
LeetCode 面试题 04.05. 合法二叉搜索树题目解题解题一:中序遍历解题二:传递最小与最大值题目解题如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也为二叉搜索树。注意⚠️ ,是严格的小于和严格的大雨,换言之,如果出现重复值,判断为 false。解题一:中序遍历// javascript// 声明全局变量,但不能在这里初始化// 因为如果函数被调用多次,需要每次都初始化为 -I原创 2021-08-09 00:36:24 · 256 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 04.04. 检查平衡性 & 剑指Offer 55 - II & 110 平衡二叉树
LeetCode 面试题 04.04. 检查平衡性题目解题方法一:自顶向下的递归方法二:自底向上的递归题目解题这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。方法一:自顶向下的递归有了计算节点高度的函数,即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点翻译 2021-08-09 00:34:49 · 238 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 04.03. 特定深度节点链表
LeetCode 面试题 04.03. 特定深度节点链表题目解题深度优先搜索 DFS广度优先搜索 BFS题目解题深度优先搜索 DFS// javascriptvar listOfDepth = function(tree) { let lists = []; createLevelLinkedList(tree, lists, 0); return lists;};var createLevelLinkedList = function(root, lists,原创 2021-08-09 00:34:09 · 197 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 04.02. 最小高度树
LeetCode 面试题 04.02. 最小高度树题目解题题目解题// javascriptvar createMinimalBST = function(nums, start, end) { if (start > end) { // 结束条件 return null; } // [0,-3,9,-10,null,5] let mid = Math.ceil((start + end) / 2); // [0,-10,5,nul原创 2021-08-09 00:33:23 · 139 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 04.01. 节点间通路
LeetCode 面试题 04.01. 节点间通路题目解题解题一:邻接表+广度优先搜索解题二:邻接表+深度优先搜索解法三:Bellman Ford解法四:倒序递归+深度优先搜索题目解题解题一:邻接表+广度优先搜索var findWhetherExistsPath = function(n, graph, start, target) { // 创建 邻接表 let record = new Map(); for (let [src, des] of graph) {原创 2021-08-09 00:31:29 · 297 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 03.06. 动物收容所
LeetCode 面试题 03.06. 动物收容所题目解题解题一解题二解题三题目“最老”可以用编号来比较,编号越小,代表越老,题目已经给了动物编号,如果没有需要自己创建编号或者记录时间戳。"dequeueAny" 是要 dequeue 猫和狗中最老的。解题解题一// javascriptvar AnimalShelf = function() { this.queueAnimal = [];};/** * @param {number[]} animal * @retu原创 2021-08-05 20:21:27 · 234 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 03.05. 栈排序
LeetCode 面试题 03.05. 栈排序题目解题题目解题《程序员面试金典》上是对一个已有栈进行排序,但是思路是一样的,解释直接放在代码注释里面。// javascriptvar SortedStack = function() { this.stackSorted = []; this.stackTemp = [];};/** * @param {number} val * @return {void} */SortedStack.prototype.p原创 2021-08-05 20:03:04 · 114 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 03.04. 化栈为队
LeetCode 面试题 03.04. 化栈为队题目解题解题一解题二题目解题解题一/** * Initialize your data structure here. */var MyQueue = function() { this.inStack = []; this.outStack = [];};/** * Push element x to the back of queue. * @param {number} x * @return {void}原创 2021-08-05 18:33:22 · 134 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 03.03. 堆盘子
LeetCode 面试题 03.03. 堆盘子题目解题解题一:允许中间 stack 不满解题二:不允许中间 stack 不满题目解题push 和 pop 不难实现,要注意的是若最后一个栈被填满,就需新建一个栈,再把元素 push 进去;最后一个元素 pop 出去后,若最后 一个栈为空 (执行出栈操作后),就必须从栈数组中移除这个栈。popAt 的问题在于会选择任意的 stack 删除元素,中间的 stack 可能会不满或者因为空了要被删除。这里要讨论一下是否允许除最后一个 stack 外的其他 s原创 2021-08-04 16:57:13 · 251 阅读 · 0 评论 -
LeetCode155 最小栈 &《程序员面试金典》面试题 03.02. 栈的最小值 & 剑指Offer 30 包含min函数的栈
LeetCode 面试题 03.02. 栈的最小值题目解题解题一解题二题目重点:题目要求执行 push、pop 和 min 操作的时间复杂度必须为O(1)O(1)O(1)。解题解题一用指针来指示栈顶位置,不执行 push 和 pop 操作:/** * initialize your data structure here. */var MinStack = function() { this.minStack = []; this.minValue = [];原创 2021-08-04 13:12:06 · 286 阅读 · 1 评论 -
LeetCode《程序员面试金典》面试题 03.01. 三合一
LeetCode 面试题 03.01. 三合一题目解题固定分割弹性分割题目解题固定分割// javascript/** * @param {number} stackSize */var TripleInOne = function(stackSize) { this.capacity = stackSize; this.stack = new Array(stackSize * 3); this.sizes = new Array(3).fill(0);};原创 2021-08-04 12:27:52 · 267 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 05.08. 绘制直线
LeetCode 面试题 05.08. 绘制直线题目解题解题一:一位一位修改解题二:高效解法题目解题解题一:一位一位修改// javascriptvar drawLine = function(length, w, x1, x2, y) { const line = new Array(length).fill(0); const width = w / 32; for (let b = x1; b <= x2; b++) { line[y * w原创 2021-07-07 09:41:15 · 194 阅读 · 2 评论 -
LeetCode《程序员面试金典》面试题 05.07. 配对交换
LeetCode 面试题 05.07. 配对交换题目解题题目题目限制了数字的范围,不会发生整数的溢出。解题如果 符号位 被 1 填充,无论与之 交换的 偶数位 是 1 还是 0,或完之后结果都是 1,无法实现交换的功能。// javascriptvar exchangeBits = function(num) { let oddToEven = (num & 0xaaaaaaaa) >>> 1; let evenToOdd = (num &原创 2021-07-07 09:40:34 · 106 阅读 · 0 评论 -
LeetCode461 汉明距离 &《程序员面试金典》面试题 05.06. 整数转换
LeetCode 面试题 05.06. 整数转换题目解题解题一:按位比较解题二:使用异或,按位找 1解题三:使用异或,高效找 1题目解题这个问题看似复杂,实则简单明了。要解决这个问题,就得设法找出两个数之间有哪些位不同。因为题目里给了数据的范围,最简单的是按位去比较。解题一:按位比较// javascriptvar convertInteger = function(A, B) { let bitCnt = 0; for (let i = 0; i < 32; i++)原创 2021-07-07 09:40:10 · 206 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 05.04. 下一个数
LeetCode 面试题 05.04. 下一个数题目解题解题一:位运算解题二:算数解法题目注意点:大小最接近的两个数,一个略大,一个略小num 不能为负:第32位不能是 1解题书上解释的很详细,注意看 return -1 的判断条件。解题一:位运算// javascriptvar getNext = function(num) { let n = num, c0 = 0, c1 = 0; while (((n & 1) === 0) &&原创 2021-07-07 09:38:37 · 256 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 05.03. 翻转数位
LeetCode 面试题 05.03. 翻转数位题目解题解题一解题二题目解题解题一代码里注释 注意点1 的部分,循环结束条件是 i < 32,比如 2147483647 (0x7FFFFFFF) 得到的数组是 [0, 31, 1],要把前面的 0 也算进去,因为第 32 位可以由 0 变为 1,这样最长的 1 序列长度为32。注意点2,因为每次 searchingFor 变换才会将之前的序列长度加入数组,最后一次没有变换便跳出循环,要把最后的序列长度加进数组。在 findLongest原创 2021-07-04 16:55:29 · 214 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 05.02. 二进制数转字符串
LeetCode 面试题 05.03. 翻转数位题目解题题目解题原创 2021-07-04 16:53:24 · 191 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 05.01. 插入
LeetCode 面试题 05.01. 插入题目解题解题一解题二题目解题解题一~0 其实是 -1,二进制的32位上全是1,即 0xFFFF,但是悲伤的是 JS 做位运算时,如果超过32 位会进行截取,因为最大的 j 输入是 31,最大的 j + 1 为 32,-1 << 32 = -1,无法达到想要的结果,所以只能 按位清除 1。在 JS 中-1 << 0 // -1-1 << 31 // -2147483648-1 <<原创 2021-07-04 16:51:57 · 184 阅读 · 0 评论 -
LeetCode142 环形链表 II &《程序员面试金典》面试题 02.08. 环路检测
LeetCode 面试题 02.08. 环路检测题目解题解题一:暴力解法解题二:三指针法题目解题没有思路的话,可以先看看官方的提示:解题一:暴力解法直接把节点(地址)存进 Set ,一旦发现相同地址重复出现,表明出现了循环,该地址便是环路的开头节点。// javascriptvar detectCycle = function(head) { let listSet = new Set(); while (head !== null) { if (!lis原创 2021-07-04 16:32:22 · 251 阅读 · 0 评论 -
LeetCode160 相交链表 &《程序员面试金典》面试题 02.07. 链表相交 & 剑指Offer 52 两个链表的第一个公共节点
LeetCode 面试题 02.07. 链表相交题目解题解题一:散列表解题二题目解题可以用散列表来做,但是最好的空间复杂度也是 O(min(A,B))O(min(A, B))O(min(A,B)), A, B 分别是两个链表的节点个数。解题一:散列表// javascriptvar getIntersectionNode = function(headA, headB) { let mapA = new Map(); while (headA !== null) {原创 2021-06-13 17:33:22 · 230 阅读 · 5 评论 -
LeetCode234 &《程序员面试金典》面试题 02.06. 回文链表
LeetCode 面试题 02.06. 回文链表题目解题解题一:反转并比较解题二:迭代法解法三:递归法题目解题要解决这个问题,可以将回文 (palindrome) 定义为 0 -> 1 -> 2 -> 1 -> 0。显然,若链表是回文,不管正着看还是反着看,都是一样的。解题一:反转并比较做题目的时候可能是脑子出去神游了,竟然特开心地在反转链表时没有new node,直接拿的原链表节点,结果把原链表给改了,比较的时候就比较了个寂寞。以后解题之前应该先判断一下原链表是否可以被原创 2021-06-13 14:49:04 · 359 阅读 · 6 评论 -
LeetCode2 两数相加 &《程序员面试金典》面试题 02.05. 链表求和
LeetCode2 两数相加 & 面试题 02.05. 链表求和题目解法简单版解法进阶版解法题目注意这边有两个问题:[简单版] 和 [进阶版]解法简单版解法// javascriptvar addTwoNumbers = function(l1, l2) { let sum = 0, carry = 0; let ResNode = new ListNode(0); const ResHead = ResNode; while (l1 !== null原创 2021-06-12 23:56:39 · 234 阅读 · 1 评论 -
LeetCode《程序员面试金典》面试题 02.04. 分割链表
LeetCode 面试题 02.04. 分割链表题目解题解法一解法二解法三题目注意验证:链表为空的情况!!解题刚拿到这道题时,马上想到快速排序里面的 partition 算法,但是这题要求没有那么严格:大于等于 x 的元素只要在右半部分即可,没有要求 x 的左边全是小于等于 x 的数,右边全是大于等于 x 的数。解法一# python# Definition for singly-linked list.# class ListNode:# def __init__(self,原创 2021-06-12 21:51:09 · 207 阅读 · 2 评论 -
LeetCode237 删除链表中的节点 &《程序员面试金典》面试题 02.03. 删除中间节点
LeetCode 面试题 02.03. 删除中间节点题目解答题目解答python:# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def deleteNode(self, node): """ :type原创 2021-06-12 21:49:35 · 104 阅读 · 0 评论 -
LeetCode《程序员面试金典》面试题 02.02. 返回倒数第 k 个节点 & 剑指Offer 22 链表中倒数第k个节点
LeetCode 面试题 02.02. 返回倒数第 k 个节点题目解题解题一:迭代法解题二:递归题目解题解题一:迭代法链表题经常会用双指针来做,这道题便是一个典型。var kthToLast = function(head, k) { i_Node = j_Node = head; stepAhead = 0; while (i_Node){ i_Node = i_Node.next; if (stepAhead < k){原创 2021-06-12 21:47:59 · 136 阅读 · 0 评论