程序员面试金典(Java代码)
程序员面试金典
01
- 面试题 01.01. 判定字符是否唯一
- 面试题 01.02. 判定是否互为字符重排
- 面试题 01.03. URL化
- 面试题 01.04. 回文排列
- 面试题 01.05. 一次编辑
- 面试题 01.06. 字符串压缩
- 面试题 01.07. 旋转矩阵
- 面试题 01.08. 零矩阵
- 面试题 01.09. 字符串轮转
面试题 01.01. 判定字符是否唯一
1 | class Solution { |
面试题 01.02. 判定是否互为字符重排
1 | class Solution { |
面试题 01.03. URL化
1 | class Solution { |
面试题 01.04. 回文排列
1 | class Solution { |
面试题 01.05. 一次编辑
1 | class Solution { |
面试题 01.06. 字符串压缩
1 | class Solution { |
面试题 01.07. 旋转矩阵
1 | class Solution { |
面试题 01.08. 零矩阵
1 | class Solution { |
面试题 01.09. 字符串轮转
contains()
其实就是模式匹配,这里不想手写kmp了
1 | class Solution { |
手写kmp,速度没库函数高
1 | class Solution { |
02
- 面试题 02.01. 移除重复节点
- 面试题 02.02. 返回倒数第 k 个节点
- 面试题 02.03. 删除中间节点
- 面试题 02.04. 分割链表
- 面试题 02.05. 链表求和
- 面试题 02.06. 回文链表
- 面试题 02.07. 链表相交
- 面试题 02.08. 环路检测
面试题 02.01. 移除重复节点
1 | /** |
面试题 02.02. 返回倒数第 k 个节点
1 | /** |
面试题 02.03. 删除中间节点
1 | /** |
面试题 02.04. 分割链表
1 | /** |
面试题 02.05. 链表求和
1 | /** |
面试题 02.06. 回文链表
1 | /** |
面试题 02.07. 链表相交
1 | /** |
面试题 02.08. 环路检测
1 | /** |
03
面试题 03.01. 三合一
1 | class TripleInOne { |
面试题 03.02. 栈的最小值
1 | class MinStack { |
面试题 03.03. 堆盘子
往之前抛出的栈加后面抛出顺序就是不对的!!!脑抽了
1 | class StackOfPlates { |
面试题 03.04. 化栈为队
也是经典题目了
1 | class MyQueue { |
面试题 03.05. 栈排序
1 | class SortedStack { |
面试题 03.06. 动物收容所
1 | class AnimalShelf { |
04
- 面试题 04.01. 节点间通路
- 面试题 04.02. 最小高度树
- 面试题 04.03. 特定深度节点链表
- 面试题 04.04. 检查平衡性
- 面试题 04.05. 合法二叉搜索树
- 面试题 04.06. 后继者
- 面试题 04.08. 首个共同祖先
- 面试题 04.09. 二叉搜索树序列
- 面试题 04.10. 检查子树
- 面试题 04.12. 求和路径
面试题 04.01. 节点间通路
1 | class Solution { |
面试题 04.02. 最小高度树
1 | /** |
面试题 04.03. 特定深度节点链表
1 | /** |
面试题 04.04. 检查平衡性
1 | /** |
面试题 04.05. 合法二叉搜索树
1 | /** |
没想到递归做法
1 | /** |
面试题 04.06. 后继者
1 | /** |
1 | /** |
面试题 04.08. 首个共同祖先
后续递归返回结果并处理的过程就相当于从底到顶的处理了,为空或者遇到要求的直接返回就好了,然后后序递归处理,如果左右都不为空就返回根,不然返回不为null的那个,都为空就随便返回了
1 | class Solution { |
面试题 04.09. 二叉搜索树序列
1 | class Solution { |
这里的Deque用List当前也可以,反正能回溯就行
1 | class Solution { |
面试题 04.10. 检查子树
1 |
|
面试题 04.12. 求和路径
1 | class Solution { |
05
面试题 05.01. 插入
1 | class Solution { |
上面不优雅,研究一下位运算怎么解决
1 | class Solution { |
面试题 05.02. 二进制数转字符串
1 | ``` |
面试题 08.02. 迷路的机器人
深搜过不了,只能dp了
1 | class Solution { |
面试题 08.03. 魔术索引
不知道二分能不能写的,On很简单
1 | class Solution { |
1 | // int result = -1; |
面试题 08.04. 幂集
1 | class Solution { |
面试题 08.05. 递归乘法
有取巧的,两数相乘就是A个B相加
1 | class Solution { |
面试题 08.06. 汉诺塔问题
1 | class Solution { |
面试题 08.07. 无重复字符串的排列组合
1 | class Solution { |
面试题 08.08. 有重复字符串的排列组合
1 | class Solution { |
面试题 08.09. 括号
1 | class Solution { |
面试题 08.10. 颜色填充
1 | class Solution { |
面试题 08.11. 硬币
1 | class Solution { |
面试题 08.12. 八皇后
1 | class Solution { |
10
面试题 10.01. 合并排序的数组
1 | class Solution { |
面试题 10.02. 变位词组
1 | class Solution { |
感受到算法的魅力,暴力遍历字符串每位保存到hash看a-z的个数是否相等判断非常耗时间!!!1100ms -> 7ms
面试题 10.05. 稀疏数组搜索
1 | class Solution { |
还是网上大佬多呀,不过题目的这个描述的排序很抽象
1 | class Solution { |
面试题 10.09. 排序矩阵查找
1 | class Solution { |
还是突破不了到最优,不管了
1 | class Solution { |
16
- 面试题 16.01. 交换数字
- 面试题 16.02. 单词频率
- 面试题 16.04. 井字游戏
- 面试题 16.06. 最小差
- 面试题 16.07. 最大数值
- 面试题 16.10. 生存人数
- 面试题 16.11. 跳水板
- 面试题 16.15. 珠玑妙算
- 面试题 16.16. 部分排序
- 试题 16.17. 连续数列
- 面试题 16.18. 模式匹配
- 面试题 16.19. 水域大小
- 面试题 16.20. T9键盘
- 面试题 16.21. 交换和
- 面试题 16.24. 数对和
- 面试题 16.25. LRU 缓存
- 面试题 16.26. 计算器
面试题 16.01. 交换数字
1 | class Solution { |
面试题 16.02. 单词频率
1 | class WordsFrequency { |
面试题 16.04. 井字游戏
1 | class Solution { |
面试题 16.06. 最小差
暴力会超时间限制,注意int范围
1 | class Solution { |
面试题 16.07. 最大数值
1 | class Solution { |
面试题 16.10. 生存人数
1 | class Solution { |
优化
1 | class Solution { |
面试题 16.11. 跳水板
1 | class Solution { |
面试题 16.15. 珠玑妙算
统计猜中位置的数量,还统计颜色出现的次数,看出现相同颜色的次数是多少次,出现相同颜色的次数-猜中位置的次数就是伪猜中的次数
1 | class Solution { |
面试题 16.16. 部分排序
1 | class Solution { |
试题 16.17. 连续数列
1 | class Solution { |
面试题 16.18. 模式匹配
1 | class Solution { |
面试题 16.19. 水域大小
1 | class Solution { |
面试题 16.20. T9键盘
最下面的解法时间复杂度还是很高
下面递归超时
1 | class Solution { |
从words回构
1 | class Solution { |
再优化,不用全构建出来
1 | class Solution { |
面试题 16.21. 交换和
1 | class Solution { |
面试题 16.24. 数对和
1 | class Solution { |
面试题 16.25. LRU 缓存
1 | class LRUCache { |
面试题 16.26. 计算器
1 | class Solution { |
优化最后的计算过程,去掉判空,因为题目说一定符合计算要求,考虑去掉空格就好
1 | class Solution { |
感觉不用栈模拟,直接在List上遍历处理应该也可以,但还是栈直接,直接遍历操作list容易写错
17
- 面试题 17.01. 不用加号的加法
- 面试题 17.04. 消失的数字
- 面试题 17.05. 字母与数字
- 面试题 17.06. 2出现的次数
- 面试题 17.07. 婴儿名字
- 面试题 17.08. 马戏团人塔
- 面试题 17.09. 第 k 个数
- 面试题 17.10. 主要元素
- 面试题 17.11. 单词距离
- 面试题 17.12. BiNode
- 面试题 17.16. 按摩师
面试题 17.01. 不用加号的加法
1 | class Solution { |
面试题 17.04. 消失的数字
1 | class Solution { |
面试题 17.05. 字母与数字
dp超时
1 | class Solution { |
前缀和
1 | class Solution { |
面试题 17.06. 2出现的次数
数位dp
1 | class Solution { |
面试题 17.07. 婴儿名字
1 | class Solution { |
面试题 17.08. 马戏团人塔
dp超时
1 | class Solution { |
优化,贪心(LIS,最长递增子序列)+二分
1 | class Solution { |
面试题 17.09. 第 k 个数
优先队列+哈希去重
1 | class Solution { |
动态规划优化
1 | class Solution { |
面试题 17.10. 主要元素
1 | class Solution { |
面试题 17.11. 单词距离
暴力,后面再优化吧
1 | class Solution { |
面试题 17.12. BiNode
1 | /** |
面试题 17.16. 按摩师
1 | class Solution { |