程序员面试金典系列完结撒花!!
本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考
总的来说, 写这个系列耗费了我不少精力, 不过我也很开心能和大家分享, 真心希望能对大家有所帮助, 也希望大家能够多多点赞转发和分享, 让更多人看到, 谢谢~
接下来我需要休整几周来准备新的系列了, 开始后还是老样子, 每周日 18:45 更新, 大家敬请期待哦!
P.S. 公众号 算法精选 里新加了一个暗号 面试金典总结! 关注公众号 算法精选 后, 在聊天框中回复 面试金典总结 就能快速定位到这篇文章啦, 大家可以试试哦~
字符串
程序员面试金典 - 面试题 01.01. 判定字符是否唯一
程序员面试金典 - 面试题 01.02. 判定是否互为字符重排
程序员面试金典 - 面试题 01.03. URL 化
程序员面试金典 - 面试题 01.04. 回文排列
- 字符计数字典, 保证奇数数目的字符种类数不超过 1
程序员面试金典 - 面试题 01.05. 一次编辑
程序员面试金典 - 面试题 01.06. 字符串压缩
程序员面试金典 - 面试题 01.09. 字符串轮转
- 先检查长度, 然后拼接 s1, 判断 s2 是否是其子串
程序员面试金典 - 面试题 10.02. 变位词组
程序员面试金典 - 面试题 16.02. 单词频率
程序员面试金典 - 面试题 16.08. 整数的英语表示
程序员面试金典 - 面试题 16.18. 模式匹配
- 处理特殊情况 -> 遍历字符 a 映射后的字符串的所有可能长度
程序员面试金典 - 面试题 17.07. 婴儿名字
程序员面试金典 - 面试题 17.11. 单词距离
- 方法 1: 单次遍历 + 维护两个最后下标
- 方法 2: 下标字典 + 双指针
程序员面试金典 - 面试题 17.17. 多次搜索
- 方法 1: 语言自带 find
- 方法 2: 字典树存 smalls + 遍历 big 的每个起点
程序员面试金典 - 面试题 17.18. 最短超串
程序员面试金典 - 面试题 17.22. 单词转换
- BFS + 找所有邻居 + 维护前一单词到当前单词的映射字典
程序员面试金典 - 面试题 17.26. 稀疏相似度
- {单词:文档 id 列表}倒排索引字典 + 只求有共同单词的文档的相似度
数字/数组
程序员面试金典 - 面试题 08.03. 魔术索引
程序员面试金典 - 面试题 10.01. 合并排序的数组
程序员面试金典 - 面试题 10.03. 搜索旋转数组
程序员面试金典 - 面试题 10.05. 稀疏数组搜索
程序员面试金典 - 面试题 10.11. 峰与谷
程序员面试金典 - 面试题 16.05. 阶乘尾数
程序员面试金典 - 面试题 16.06. 最小差
程序员面试金典 - 面试题 16.10. 生存人数
程序员面试金典 - 面试题 16.11. 跳水板
程序员面试金典 - 面试题 16.15. 珠玑妙算
程序员面试金典 - 面试题 16.16. 部分排序
程序员面试金典 - 面试题 16.21. 交换和
程序员面试金典 - 面试题 16.24. 数对和
程序员面试金典 - 面试题 17.04. 消失的数字
程序员面试金典 - 面试题 17.05. 字母与数字
程序员面试金典 - 面试题 17.06. 2 出现的次数
- 判断每一位: 分大等小三情况 + 左右部分计数相乘
程序员面试金典 - 面试题 17.08. 马戏团人塔
程序员面试金典 - 面试题 17.09. 第 k 个数
- 方法 1: 最小堆 + 集合
- 方法 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. 翻转数位
程序员面试金典 - 面试题 05.04. 下一个数
程序员面试金典 - 面试题 05.06. 整数转换
程序员面试金典 - 面试题 05.07. 配对交换
程序员面试金典 - 面试题 05.08. 绘制直线
程序员面试金典 - 面试题 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 缓存
程序员面试金典 - 面试题 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. 节点间通路
程序员面试金典 - 面试题 04.02. 最小高度树
程序员面试金典 - 面试题 04.03. 特定深度节点链表
程序员面试金典 - 面试题 04.04. 检查平衡性
程序员面试金典 - 面试题 04.05. 合法二叉搜索树
程序员面试金典 - 面试题 04.06. 后继者
- 利用二叉搜索树性质二分迭代查找 / 中序遍历找前一个节点是 p 的节点
程序员面试金典 - 面试题 04.08. 首个共同祖先
- 方法 1 - 递归: 返回 findp 和 findq, 找第一个都为 true 的节点, 即为最近祖先
- 方法 2 - 迭代: parent 字典 + visit 集合, 找到一个在 v 集合的父节点后就直接返回, 它就是最近祖先
程序员面试金典 - 面试题 04.09. 二叉搜索树序列
- 递归搜索: 传入当前节点 + 下个有效节点集合 + 当前数组, 集合为空时说明找到了一个合法数组
程序员面试金典 - 面试题 04.10. 检查子树
- 额外递归方法判断两树是否完全相等, 然后传入 t1 和 t2, 不相等时再递归自身, 判断 t2 和 t1 的左/右子节点
程序员面试金典 - 面试题 04.12. 求和路径
- 递归 + 前缀和计数字典: 当前和减去 sum 的前缀和计数即为以当前节点为终点的有效路径个数
程序员面试金典 - 面试题 10.10. 数字流的秩
图
程序员面试金典 - 面试题 01.07. 旋转矩阵
程序员面试金典 - 面试题 01.08. 零矩阵
- 使用第 0 行/列标记该行/列的含 0 情况, 结合额外 flag 处理第 0 行/列自身含 0 的情况
程序员面试金典 - 面试题 08.10. 颜色填充
程序员面试金典 - 面试题 10.09. 排序矩阵查找
程序员面试金典 - 面试题 16.03. 交点
程序员面试金典 - 面试题 16.04. 井字游戏
程序员面试金典 - 面试题 16.13. 平分正方形
程序员面试金典 - 面试题 16.14. 最佳直线
- 两重循环 + 计算斜截式 + 字典存(k,b)->(second_i,point_cnt)
程序员面试金典 - 面试题 16.19. 水域大小
程序员面试金典 - 面试题 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
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家关注~