DSA面试题
作者 Aaron Cao · 更新于

DSA面试反复用到一小组固定模式,而不是成百上千道互不相同的题目。常见考点包括数组与字符串、双指针与滑动窗口、哈希、二分查找、树与图、堆,以及动态规划,且都是需要你边解题边讲解思路的实时问题。
DSA面试到底在考查什么?
你已经刷了几百道题,却还是觉得没准备好,这通常说明你练习的是错误的那一半。本节说明面试到底在考查什么,让练习方向对上。
一场实时的数据结构与算法面试会同时考查四件事:你能否识别题目属于哪种模式、你能否在写代码前说清思路、实现在边界情况下是否正确,以及你能否口头分析复杂度。很多候选人只优化第三点、忽略第二点,结果一个正确却没有解释的答案反而被扣分。
识别这一步,正是模式练习胜过刷题数量的原因。题目很少是全新的,大多是已知模式的组合。一旦你能在头一分钟内说出这是在频率映射表上做滑动窗口,剩下的就只是执行。按语言和岗位划分的相关题库见面试问题库。
你需要掌握哪些模式?
这些模式覆盖了大部分常见考题。要学会识别指向每种模式的信号。
- 双指针。有序输入、两数之和、原地分区、回文判断。
- 滑动窗口。在约束条件下求最长或最短的连续子数组。
- 哈希表计数。字母异位词、重复元素、频率比较、第一个不重复元素。
- 二分查找。有序数组,以及数组无序时在答案空间上做二分。
- 广度优先与深度优先搜索。树、网格、连通分量、无权最短路径。
- 堆与优先队列。前 k 个问题、合并有序数据流、动态求中位数。
- 区间问题。按起点排序后进行合并、插入和重叠检测。
- 动态规划。重叠子问题:爬楼梯、零钱兑换、编辑距离、子序列问题。
- 回溯。排列、组合、子集、约束类谜题。
- 图算法。拓扑排序、并查集、带权最短路径。
按主题划分,会问到哪些问题?
以下是面试官常用措辞给出的代表性题目:
- 在数组中找到两个和为目标值的数,然后不使用额外空间实现。
- 返回不含重复字符的最长子串的长度。
- 给定一个旋转排序数组,在对数时间内找到目标值。
- 合并重叠区间,并说明为什么排序这一步是值得的。
- 翻转一棵二叉树,然后求出它的最大深度。
- 验证一棵二叉搜索树,并说明简单粗暴的检查会漏掉什么。
- 统计网格中岛屿的数量,然后说明当网格大到内存放不下时该如何处理。
- 找出出现频率最高的 k 个元素,并说明你选择该数据结构的理由。
- 计算凑出某个金额所需的最少硬币数,并写出递推式。
- 检测链表中是否存在环,然后返回环的起始节点。
- 对一棵二叉树进行序列化与反序列化。
- 给定课程的先修关系,判断该课程安排是否可行。
一位应聘后端岗位的应届生拿到子串问题后立刻开始敲代码。代码几乎是对的,但面试官整场都在追问这段代码在做什么,最终的评分反映的是这份沉默,而不是那个小 bug。而另一位候选人花四十秒说出在字符映射表上滑动窗口,遇到重复就收缩左边界,同时记录最大值,就已经通过了最难挽回的那部分。
如何练习边解题边讲解?
常见问题
DSA面试前应该刷多少道题?
覆盖这些模式比刷题数量更重要。能识别并实现上述每种模式、并口头讲清楚的人,比默默刷了更多题的人准备得更充分。
大多数面试都要求掌握动态规划吗?
动态规划确实经常出现,但它只是众多模式中的一种,很少构成整场面试。熟练掌握数组、哈希、树和图,比把动态规划放在首位更有用。
我应不应该在没人问的情况下主动说明复杂度?
应该。在提出思路时说明时间和空间复杂度,做完后再说一遍,这被视为完整答案的一部分,而不是加分项。
如果我找不到最优解怎么办?
直接说明这一点,实现你已经想到的可行方案,并说明它为什么不是最优的。一个正确答案配上诚实的复杂度说明,比沉默地苦苦寻找理想解得分更高。
AI 助手能在 DSA 面试环节中提供帮助吗?
只有在该环节是实时口头对话时才可以,即便如此,录音、共享屏幕或监考也会排除这种可能。浏览器内的打字测试不在适用范围内,粘贴代码还会触发相似度检测。