程序员面试金典总结 - leetcode 程序员面试金典系列

程序员面试金典系列完结撒花!!

本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考

总的来说, 写这个系列耗费了我不少精力, 不过我也很开心能和大家分享, 真心希望能对大家有所帮助, 也希望大家能够多多点赞转发和分享, 让更多人看到, 谢谢~

接下来我需要休整几周来准备新的系列了, 开始后还是老样子, 每周日 18:45 更新, 大家敬请期待哦!

P.S. 公众号 算法精选 里新加了一个暗号 面试金典总结! 关注公众号 算法精选 后, 在聊天框中回复 面试金典总结 就能快速定位到这篇文章啦, 大家可以试试哦~


字符串

程序员面试金典 - 面试题 01.01. 判定字符是否唯一

  • 位图代替集合判断是否重复

程序员面试金典 - 面试题 01.02. 判定是否互为字符重排

  • 单计数字典

程序员面试金典 - 面试题 01.03. URL 化

  • 字符数组预留空位, 然后逆序遍历并替换

程序员面试金典 - 面试题 01.04. 回文排列

  • 字符计数字典, 保证奇数数目的字符种类数不超过 1

程序员面试金典 - 面试题 01.05. 一次编辑

  • 先判断长度差, 然后双指针比较, 分三种情况

程序员面试金典 - 面试题 01.06. 字符串压缩

  • 利用字符串计数简单模拟

程序员面试金典 - 面试题 01.09. 字符串轮转

  • 先检查长度, 然后拼接 s1, 判断 s2 是否是其子串

程序员面试金典 - 面试题 10.02. 变位词组

  • 排序后字符串作为 key

程序员面试金典 - 面试题 16.02. 单词频率

  • 计数字典

程序员面试金典 - 面试题 16.08. 整数的英语表示

  • 数字->单词映射字典 + 转换 3 位一组的数字

程序员面试金典 - 面试题 16.18. 模式匹配

  • 处理特殊情况 -> 遍历字符 a 映射后的字符串的所有可能长度

程序员面试金典 - 面试题 17.07. 婴儿名字

  • 并查集 + 保证祖先字典序最小

程序员面试金典 - 面试题 17.11. 单词距离

  1. 方法 1: 单次遍历 + 维护两个最后下标
  2. 方法 2: 下标字典 + 双指针

程序员面试金典 - 面试题 17.17. 多次搜索

  1. 方法 1: 语言自带 find
  2. 方法 2: 字典树存 smalls + 遍历 big 的每个起点

程序员面试金典 - 面试题 17.18. 最短超串

  • 滑动窗口 + 计数字典 + 尚未匹配个数

程序员面试金典 - 面试题 17.22. 单词转换

  • BFS + 找所有邻居 + 维护前一单词到当前单词的映射字典

程序员面试金典 - 面试题 17.26. 稀疏相似度

  • {单词:文档 id 列表}倒排索引字典 + 只求有共同单词的文档的相似度

数字/数组

程序员面试金典 - 面试题 08.03. 魔术索引

  • 顺序遍历, 值大于下标时跳转

程序员面试金典 - 面试题 10.01. 合并排序的数组

  • 多指针 + 从后向前归并排序

程序员面试金典 - 面试题 10.03. 搜索旋转数组

  • 找旋转点 -> 两次二分查找

程序员面试金典 - 面试题 10.05. 稀疏数组搜索

  • 递归二分查找

程序员面试金典 - 面试题 10.11. 峰与谷

  • 偶峰奇谷, 不满足时交换

程序员面试金典 - 面试题 16.05. 阶乘尾数

  • 找因子 5 的个数

程序员面试金典 - 面试题 16.06. 最小差

  • 排序 -> 二分查找

程序员面试金典 - 面试题 16.10. 生存人数

  • 差分数组 + 下标转换

程序员面试金典 - 面试题 16.11. 跳水板

  • 枚举长木板个数

程序员面试金典 - 面试题 16.15. 珠玑妙算

  • 计算完全正确的 -> 排除它们再计算其他的

程序员面试金典 - 面试题 16.16. 部分排序

  • 两次遍历找中间部分的左右边界

程序员面试金典 - 面试题 16.21. 交换和

  • 计算数组和差值 -> 转集合并遍历

程序员面试金典 - 面试题 16.24. 数对和

  • 计数字典 + 注意两个数字相等的特殊情况

程序员面试金典 - 面试题 17.04. 消失的数字

  • 前 n 项和 - 数组总和

程序员面试金典 - 面试题 17.05. 字母与数字

  • 前缀差值计数 + 首个终点下标字典

程序员面试金典 - 面试题 17.06. 2 出现的次数

  • 判断每一位: 分大等小三情况 + 左右部分计数相乘

程序员面试金典 - 面试题 17.08. 马戏团人塔

  • 身高升序体重降序 -> 求最长递增子序列

程序员面试金典 - 面试题 17.09. 第 k 个数

  1. 方法 1: 最小堆 + 集合
  2. 方法 2: 三指针 + 有序序列归并

程序员面试金典 - 面试题 17.10. 主要元素

  • 投票法: 维护主要元素 + 更新计数

程序员面试金典 - 面试题 17.14. 最小 K 个数

  • 排序 / 最大堆 / 快速选择

程序员面试金典 - 面试题 17.19. 消失的两个数字

  • 扩充两正数 + 负数标记

程序员面试金典 - 面试题 17.20. 连续中值

  • 动态维护双堆: 左边大顶堆 + 右边小顶堆

程序员面试金典 - 面试题 17.21. 直方图的水量

  • 顺序遍历求左侧最高高度 + 逆序遍历求右侧最高高度

位运算

程序员面试金典 - 面试题 05.01. 插入

  • N 的 i~j 的部分清 0 -> M 左移 i 位 -> 两者取或

程序员面试金典 - 面试题 05.02. 二进制数转字符串

  • 每次乘 2 并追加整数位, 剩余小数位继续运算直到为 0 或超过 32 位范围

程序员面试金典 - 面试题 05.03. 翻转数位

  • 双指针记录上一个连续 1 和当前连续 1 的长度

程序员面试金典 - 面试题 05.04. 下一个数

  • 位运算交换 01 求略大数和略小数

程序员面试金典 - 面试题 05.06. 整数转换

  • 求异或 -> 计算 1 的个数

程序员面试金典 - 面试题 05.07. 配对交换

  • 奇数变偶数 | 偶数变奇数

程序员面试金典 - 面试题 05.08. 绘制直线

  • 分三部分填充: 左侧 + 中间全 1 + 右侧

程序员面试金典 - 面试题 16.01. 交换数字

  • 三次异或

程序员面试金典 - 面试题 16.07. 最大数值

  • 检查差的符号位

程序员面试金典 - 面试题 16.09. 运算

  • 构造取反方法实现减法 + 构造左移方法&因子分解实现乘除法

程序员面试金典 - 面试题 17.01. 不用加号的加法

  • 异或求不带进位和 + 与和左移求进位

链表

程序员面试金典 - 面试题 02.01. 移除重复节点

  • 使用集合存储遍历过的节点值, 或两重循环判断以避免额外存储

程序员面试金典 - 面试题 02.02. 返回倒数第 k 个节点

  • 快慢指针, 快指针先走 k 步, 然后快慢指针一起走

程序员面试金典 - 面试题 02.03. 删除中间节点

  • 将 next 节点值赋给当前节点, 然后删除 next 节点

程序员面试金典 - 面试题 02.04. 分割链表

  • 快排思想, 小的放左边, 大的放右边, 最后连起来

程序员面试金典 - 面试题 02.05. 链表求和

  • 使用哨兵, 维护进位 (正向存放时须先翻转再求和再翻转)

程序员面试金典 - 面试题 02.06. 回文链表

  • 快慢指针找中点 -> 翻转右半部分 -> 双指针判断是否回文

程序员面试金典 - 面试题 02.07. 链表相交

  • 双指针遍历, 到结尾时换成对方的头继续, 相等时要么相交(非空), 要么无相交(空节点)

程序员面试金典 - 面试题 02.08. 环路检测

  • 快慢指针直到相遇 -> 慢指针重置为头 -> 两指针同速直到再次相遇

程序员面试金典 - 面试题 16.25. LRU 缓存

  • 双向链表 + {key:node}字典

程序员面试金典 - 面试题 17.12. BiNode

  • 中序遍历 + 维护链表前一节点

栈/队列

程序员面试金典 - 面试题 03.01. 三合一

  • 预留空间分三部分, 记录每个栈的栈顶下标和元素个数

程序员面试金典 - 面试题 03.02. 栈的最小值

  • 额外单调递减栈, 当前 push 值小于等于单调栈顶时 push, 当前 pop 值等于单调栈顶时 pop

程序员面试金典 - 面试题 03.03. 堆盘子

  • 栈数组模拟整个过程

程序员面试金典 - 面试题 03.04. 化栈为队

  • stackIn 和 stackOut 栈, 倒入时优先 in 栈, 倒出时优先 out 栈, 没有时则先将 in 栈倒入 out 栈

程序员面试金典 - 面试题 03.05. 栈排序

  • 持久化存储辅助栈, 通过倒入倒出找到合适的插入和弹出位置

程序员面试金典 - 面试题 03.06. 动物收容所

  • 两个双端队列分别存猫和狗的(id,入队时间)二元组

程序员面试金典 - 面试题 16.26. 计算器

  • 数字和操作符双栈 + 根据优先级处理

程序员面试金典 - 面试题 04.01. 节点间通路

  • 转邻接表 -> DFS/BFS 判断是否连通

程序员面试金典 - 面试题 04.02. 最小高度树

  • 递归分治区间建树, 将当前区间中点作为根

程序员面试金典 - 面试题 04.03. 特定深度节点链表

  • 按层 BFS, 记录该层头节点

程序员面试金典 - 面试题 04.04. 检查平衡性

  • 递归处理, 平衡时返回高度, 不平衡时返回-1

程序员面试金典 - 面试题 04.05. 合法二叉搜索树

  • 递归传入上下界判断 / 中序遍历判断是否有序

程序员面试金典 - 面试题 04.06. 后继者

  • 利用二叉搜索树性质二分迭代查找 / 中序遍历找前一个节点是 p 的节点

程序员面试金典 - 面试题 04.08. 首个共同祖先

  1. 方法 1 - 递归: 返回 findp 和 findq, 找第一个都为 true 的节点, 即为最近祖先
  2. 方法 2 - 迭代: parent 字典 + visit 集合, 找到一个在 v 集合的父节点后就直接返回, 它就是最近祖先

程序员面试金典 - 面试题 04.09. 二叉搜索树序列

  • 递归搜索: 传入当前节点 + 下个有效节点集合 + 当前数组, 集合为空时说明找到了一个合法数组

程序员面试金典 - 面试题 04.10. 检查子树

  • 额外递归方法判断两树是否完全相等, 然后传入 t1 和 t2, 不相等时再递归自身, 判断 t2 和 t1 的左/右子节点

程序员面试金典 - 面试题 04.12. 求和路径

  • 递归 + 前缀和计数字典: 当前和减去 sum 的前缀和计数即为以当前节点为终点的有效路径个数

程序员面试金典 - 面试题 10.10. 数字流的秩

  • 二叉搜索树, 额外存储左子树数目

程序员面试金典 - 面试题 01.07. 旋转矩阵

  • 剥洋葱, 分层 4 方向旋转

程序员面试金典 - 面试题 01.08. 零矩阵

  • 使用第 0 行/列标记该行/列的含 0 情况, 结合额外 flag 处理第 0 行/列自身含 0 的情况

程序员面试金典 - 面试题 08.10. 颜色填充

  • BFS 找连通分量, 遍历到即可涂色

程序员面试金典 - 面试题 10.09. 排序矩阵查找

  • 左下角开始, 每次排除一行或一列

程序员面试金典 - 面试题 16.03. 交点

  • 计算斜截式 -> 分四种情况找有效交点列表

程序员面试金典 - 面试题 16.04. 井字游戏

  • 外层循环 XO -> 内层四种判断

程序员面试金典 - 面试题 16.13. 平分正方形

  • 两中心连线 + 斜截式求交点并排序

程序员面试金典 - 面试题 16.14. 最佳直线

  • 两重循环 + 计算斜截式 + 字典存(k,b)->(second_i,point_cnt)

程序员面试金典 - 面试题 16.19. 水域大小

  • BFS 遍历 8 方向找连通分量

程序员面试金典 - 面试题 16.20. T9 键盘

  • 数字字母映射字典

程序员面试金典 - 面试题 16.22. 兰顿蚂蚁

  • 模拟 + 维护当前网格值和四边界

程序员面试金典 - 面试题 17.23. 最大黑方阵

  • 维护当前格子向左和向上最大连续黑边长 + 从最大可能边长开始遍历

程序员面试金典 - 面试题 17.24. 最大子矩阵

  • 二重循环上下边界压缩成单行数组 -> 求连续子数组最大和

程序员面试金典 - 面试题 17.25. 单词矩阵

  • 字典树 + {单词宽度:单词列表}映射字典 + 从大到小遍历宽度 + 传入宽度数目的根节点回溯

递归回溯

程序员面试金典 - 面试题 08.04. 幂集

  • 递归回溯 / 迭代位运算

程序员面试金典 - 面试题 08.05. 递归乘法

  • 二进制乘法: 乘每一位然后移位

程序员面试金典 - 面试题 08.06. 汉诺塔问题

  • 递归模拟盘子在三个柱子间的移动

程序员面试金典 - 面试题 08.07. 无重复字符串的排列组合

  • 递归回溯: 每次选任一剩余字符

程序员面试金典 - 面试题 08.08. 有重复字符串的排列组合

  • 找当前字符串的字典序的下一个排列, 直到找到所有排列

程序员面试金典 - 面试题 08.09. 括号

  • 递归回溯: 维护左右括号数目和当前括号字符串

程序员面试金典 - 面试题 08.12. 八皇后

  • 递归回溯: 使用三个集合分别记录当前用过的列/对角线/反对角线

动态规划/记忆化搜索

程序员面试金典 - 面试题 08.01. 三步问题

  • 三变量动态规划

程序员面试金典 - 面试题 08.02. 迷路的机器人

  • 动态规划存是否可达 -> 倒推找有效路径

程序员面试金典 - 面试题 08.11. 硬币

  • 动态规划: dp[sm]表示将总和为 sm 的方案数

程序员面试金典 - 面试题 08.13. 堆箱子

  • 逆序排序 -> 动态规划: dp[j]表示箱子 j 在顶部的最大高度

程序员面试金典 - 面试题 08.14. 布尔运算

  • 记忆化搜索 + 递归分治: 传入当前区间, 返回计算结果为 0 和 1 的方案数

程序员面试金典 - 面试题 16.17. 连续数列

  • 单变量动态规划: dp[i]表示以 i 结尾的最大和

程序员面试金典 - 面试题 17.13. 恢复空格

  • 动态规划 + 字符串集合

程序员面试金典 - 面试题 17.15. 最长单词

  • 转单词集合 + 记忆化搜索 + 检查组合可能性

程序员面试金典 - 面试题 17.16. 按摩师

  • 双变量动态规划: dp0 和 dp1 分别表示不接和接当前预约的最长时间

大家可以在下面这些地方找到我~

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家关注~

你可能感兴趣的:(Leetcode,面试,java,经验分享)