Skip to content

面试算法题类型总结与应对策略

刷了那么多题,面试到底会考哪些类型?每种类型该怎么应对?这一篇帮你做一次全局梳理,把面试算法题的核心类型一网打尽。

面试算法题全景图

面试中的算法题,大约 80% 集中在以下几类:

类型出现频率难度分布核心套路
数组与哈希表⭐⭐⭐⭐⭐简单 → 中等哈希 O(1) 查找、双指针
字符串⭐⭐⭐⭐简单 → 中等双指针、滑动窗口、DP
链表⭐⭐⭐⭐简单 → 中等快慢指针、虚拟头节点
二叉树⭐⭐⭐⭐⭐中等 → 困难递归遍历、DFS/BFS
动态规划⭐⭐⭐⭐⭐中等 → 困难状态定义 + 转移方程
回溯⭐⭐⭐中等 → 困难搜索 + 撤销选择
栈与队列⭐⭐⭐中等单调栈、优先级队列
二分查找⭐⭐⭐中等有序数组、边界条件
排序与搜索⭐⭐⭐简单 → 中等快排 partition、归并
图论⭐⭐困难DFS/BFS、并查集
位运算⭐⭐简单 → 中等异或、位掩码
数学与脑筋急转弯简单数学规律

高频类型应对策略

1. 数组与哈希表(最高频)

常见题型:

  • 两数之和 / 三数之和 / 四数之和
  • 字母异位词分组
  • 最长连续序列
  • 存在重复元素 II
  • 合并两个有序数组

核心套路:

  • 需要快速查找 → 哈希表(空间换时间)
  • 有序数组 → 双指针(对撞指针)
  • 固定窗口 → 滑动窗口
  • 子数组问题 → 前缀和

面试话术:

「这道题如果用暴力枚举是 O(n²),但我发现可以用哈希表把查找优化到 O(1),整体就是 O(n)。」

2. 链表(套路固定)

常见题型:

  • 反转链表(部分 / 全部)
  • 合并两个有序链表
  • 链表中点
  • 环形链表检测
  • 删除倒数第 N 个节点
  • 两链表交点

核心套路:

  • 找中点 / 环 → 快慢指针
  • 反转链表 → 迭代或递归,注意保存前驱
  • 删除节点 → 虚拟头节点(dummy)统一处理
  • 两链表的交点 → 先对齐长度差,再同步遍历

面试话术:

「我先用一个虚拟头节点指向原链表头部,这样删除第一个真实节点时就不需要额外判断。」

3. 二叉树(递归是灵魂)

常见题型:

  • 前序 / 中序 / 后序遍历(递归 + 迭代)
  • 层序遍历(BFS)
  • 二叉树最大深度
  • 路径总和
  • 最近公共祖先(LCA)
  • 二叉搜索树的最近公共祖先

核心套路:

  • 遍历类 → 递归模板要熟练,迭代版作为备选
  • 路径类 → 前缀和 + 回溯
  • BST 类 → 利用 BST 的有序性(值域判断)
  • LCA 类 → 递归分解,左右子树各找到一个

面试话术:

「这道题的关键是找到分解方式——如果 p、q 分别在根节点的左右子树,那根节点就是答案。」

4. 动态规划(最难,但也最套路)

常见题型:

  • 爬楼梯 / 打家劫舍
  • 0-1 背包 / 完全背包
  • 股票买卖(多个版本)
  • 最长递增子序列(LIS)
  • 编辑距离
  • 三角形最小路径和

核心套路(DP 四步法):

  1. 确定状态:找「最后一步」和「子问题」
  2. 写转移方程dp[i] = max/min(dp[i-1], dp[i-2] + nums[i])
  3. 确定初始条件:dp[0]、dp[1] 的值
  4. 计算顺序:从前往后 / 从后往前
  5. 空间优化:只用到前几个值就降维

面试话术:

「我先从最朴素的思路出发定义 dp[i],然后发现 dp[i] 只和 dp[i-1]、dp[i-2] 有关,所以可以只用一个变量来滚动更新,把空间从 O(n) 降到 O(1)。」

5. 回溯(搜索 + 撤销)

常见题型:

  • 全排列(含 / 不含重复)
  • 组合
  • 子集
  • N 皇后
  • 电话号码的字母组合
  • 单词搜索

核心套路:

java
void backtrack(路径, 选择列表) {
    if (满足结束条件) { result.add(路径); return; }
    for (选择 in 选择列表) {
        做选择;
        backtrack(路径 + [选择], ...);
        撤销选择; // 关键
    }
}

常见剪枝策略:

  • 已访问标记(用于排列)
  • 同层去重(用于含重复的排列)
  • 约束检查(用于 N 皇后)
  • 上下界剪枝(用于组合)

面试话术:

「这道题本质是一棵决策树,每个节点有两个选择(选或不选),我用回溯遍历这棵树,用一个 used 数组标记已选元素来避免重复。」

面试中的沟通技巧

面试算法题,沟通能力和代码能力同样重要

正确流程

  1. Clarify(澄清题意):确认输入输出范围、特殊情况、时间空间要求
  2. Approach(描述思路):先说思路,再说复杂度
  3. Code(写代码):边写边解释关键部分
  4. Test(测试):用边界案例验证代码
  5. Optimize(优化):如果能优化,主动提出

常见问题处理

没思路怎么办?

「让我想一下……这道题我先从最暴力的思路开始,然后看能不能优化……」

先说一个暴力解法,再逐步优化,比直接说「不会」强得多。

思路卡住了怎么办?

「这道题让我联想到之前做过的 XX 题,是不是可以用类似的方法……」

把当前题和做过的题建立联系,找到突破口。

写代码时写错了怎么办?

不要慌,自己先检查。如果发现错误:

「这里我写错了,应该是……我重新改一下。」

面试官更看重的是你能不能发现和修正错误,而不是不犯错。

总结

面试算法题的应对策略:

面试算法 = 扎实的基础题型 + 清晰的沟通表达 + 冷静的调试能力

基础题型靠多练,沟通表达靠有意识的训练,调试能力靠复盘。

记住:面试不是让你把题做出来就算成功,而是让面试官看到你的思考过程、沟通能力和代码质量。能把一道题讲清楚,比闷头写完十道题更有价值。

基于 VitePress 构建