大厂技术面常见算法题整理:30道高频真题分类汇总

面试经历作者: 美历团队

大厂技术面试30道高频算法题分类汇总,含数组、链表、树、动态规划、图论等分类,每道题附考察点、难度和解题思路,大厂面试算法题2026最新整理。

写在前面:为什么整理这30道题

去年下半年我开始集中面试,先后面了字节、阿里、腾讯、美团、京东等七八家大厂,算法环节几乎每家都考。面完之后我回头一看,发现高频题的重复率惊人——不同公司考的题,翻来覆去就是那几类。于是我花了两天时间,把面试中遇到的、以及和朋友们交流确认的高频算法题做了个分类整理,总共30道,希望能帮到正在准备面试的同学。

我按照数组/字符串、链表、树、动态规划、图论、设计题六大类来分,每道题标注了LeetCode题号、考察点、难度和解题思路要点。这些都是实打实在面试中出现过的真题,不是我从题库里随便挑的。

一、数组/字符串(6题)

1. 两数之和(LeetCode #1)

难度:简单 | 考察点:哈希表的使用

这道题简直是面试开场标配,我面字节和美团的时候都是第一道就问这个。解题思路很直接:用哈希表存储已遍历的元素,一次遍历就能搞定,时间复杂度O(n)。面试官一般会追问"如果数组有序呢",这时候双指针的方案就派上用场了。

要点:别小看简单题,面试官会从这道题延伸出很多变体,比如三数之和、四数之和,或者要求返回所有满足条件的组合。

2. 三数之和(LeetCode #15)

难度:中等 | 考察点:排序+双指针、去重逻辑

阿里面试考了这道题。排序后固定一个数,用双指针在剩余部分找两数之和等于目标值。关键难点在于去重——面试官特别在意你会不会处理重复三元组的问题。我当时第一版代码没处理去重,被面试官指出来后才补上,有点尴尬。

要点:排序O(nlogn),双指针遍历O(n²),注意跳过重复元素的逻辑。

3. 无重复字符的最长子串(LeetCode #3)

难度:中等 | 考察点:滑动窗口

腾讯二面考的。经典滑动窗口题,用双指针维护一个不含重复字符的窗口,右指针扩展、左指针收缩。面试官追问了"如果字符集只有小写字母,能不能优化",答案是可以用数组代替哈希表来记录字符出现位置。

要点:滑动窗口是数组/字符串题的核心套路,一定要熟练。

4. 合并区间(LeetCode #56)

难度:中等 | 考察点:排序+贪心

京东一面考了这道题。先按左端点排序,然后逐个判断当前区间是否与结果集中最后一个区间重叠。面试官当时让我手写排序比较器,我写了个lambda,他点了点头。这道题不难,但边界条件容易出错——比如区间端点相等算不算重叠,一定要和面试官确认清楚。

5. 滑动窗口最大值(LeetCode #239)

难度:困难 | 考察点:单调队列

字节二面考的,当时我只会暴力解法,被面试官引导后想到了单调队列。维护一个递减的双端队列,队首始终是当前窗口最大值。这道题的难点在于理解"为什么过期的元素要从队首弹出,而较小的元素要从队尾弹出"。

要点:单调队列是高频考点,建议和"柱状图中的最大矩形"一起练习。

6. 旋转数组(LeetCode #189)

难度:中等 | 考察点:数组翻转技巧

美团一面考的。最优雅的解法是三次翻转:先翻转整个数组,再翻转前k个,再翻转后n-k个。面试官还问了空间复杂度O(1)的要求,三次翻转正好满足。也有循环替换的解法,但写起来容易出错,面试时不推荐。

二、链表(4题)

7. 反转链表(LeetCode #206)

难度:简单 | 考察点:指针操作

这道题我面了不下五次,几乎每家都问。迭代法和递归法都要会写。面试官经常会追问"反转链表II(指定区间反转)",所以建议一起准备。迭代法就是三个指针prev、curr、next依次推进,递归法要理解回溯时的指针重连。

8. 合并两个有序链表(LeetCode #21)

难度:简单 | 考察点:归并思想

阿里一面考的。用虚拟头节点简化逻辑,两个指针分别遍历两个链表,每次取较小的节点接入结果链表。面试官追问了"合并K个有序链表",这就要用最小堆来优化了,时间复杂度O(NlogK)。

9. 环形链表(LeetCode #141/142)

难度:简单/中等 | 考察点:快慢指针

腾讯一面考了判断是否有环(#141),美团追问了找环的入口(#142)。快慢指针是标准解法,面试官问我"为什么快慢指针一定会在环中相遇",这需要从数学角度证明——快指针每次走2步、慢指针走1步,在环内相对速度是1,必然追上。

要点:#142找环入口的方法是相遇后让一个指针回到起点,然后两个指针同速走,再次相遇点就是入口。

10. K个一组翻转链表(LeetCode #25)

难度:困难 | 考察点:链表操作综合

字节一面考的,这道题是反转链表的进阶版。核心思路:先数够K个节点,翻转这一组,然后递归处理剩余部分。难点在于指针的连接——翻转后的头尾要正确接回原链表。我第一次写的时候尾节点没接对,debug了好一会儿。

三、树(5题)

11. 二叉树的层序遍历(LeetCode #102)

难度:中等 | 考察点:BFS

阿里和腾讯都考了。用队列做BFS,关键是要按层分组输出。面试官会看你是不是用size变量控制每层的遍历范围,而不是用null做分隔符——前者更规范。变体题包括之字形层序遍历(#103)和右视图(#199),建议一起刷。

12. 二叉树的最大深度(LeetCode #104)

难度:简单 | 考察点:递归/DFS

热身题,递归一行代码就能搞定。面试官一般不会单独考这道题,而是作为后续问题的铺垫——比如"判断平衡二叉树"、"最小深度"等。递归和迭代两种写法都要掌握。

13. 路径总和III(LeetCode #437)

难度:中等 | 考察点:前缀和+递归

美团二面考的。找路径和等于目标值的所有路径,关键是用前缀和来优化——从O(n²)降到O(n)。和"两数之和"的思路类似,用哈希表记录前缀和出现的次数。面试官说这道题能做出来的人不多,算是区分度题。

14. 二叉树的最近公共祖先(LeetCode #236)

难度:中等 | 考察点:递归后序遍历

字节和阿里都考了。后序遍历的典型应用:如果左右子树分别找到p和q,当前节点就是LCA。面试官追问了"如果是BST呢"(#235),BST版本可以利用有序性剪枝,更简单。这道题的递归逻辑要非常清晰,面试时边写边解释。

15. 验证二叉搜索树(LeetCode #98)

难度:中等 | 考察点:中序遍历/递归验证

京东二面考的。两种思路:一是中序遍历判断是否严格递增,二是递归时传递上下界。面试官更偏好第二种,因为不需要额外空间。我当时用了中序遍历的写法,面试官让我改成递归传上下界的方式,改完之后他比较满意。

四、动态规划(6题)

16. 爬楼梯(LeetCode #70)

难度:简单 | 考察点:DP入门

动态规划的经典入门题。dp[i] = dp[i-1] + dp[i-2],本质就是斐波那契。面试官会从这道题开始,逐步升级到"每次可以爬1到m步"、"最小花费爬楼梯"等变体。空间可以优化到O(1),只保留前两个状态。

17. 最长递增子序列(LeetCode #300)

难度:中等 | 考察点:DP + 二分查找

腾讯二面考的。标准DP是O(n²),用dp[i]表示以nums[i]结尾的最长递增子序列长度。面试官追问了O(nlogn)的解法——维护一个递增数组tails,用二分查找更新。这个优化思路很重要,俄罗斯套娃信封问题(#354)也用到了。

18. 编辑距离(LeetCode #72)

难度:困难 | 考察点:二维DP

阿里二面考的。dp[i][j]表示word1前i个字符变成word2前j个字符的最少操作数。状态转移要考虑插入、删除、替换三种操作取最小值。这道题的难点在于初始化——dp[i][0]=i, dp[0][j]=j,表示空串到目标串的操作数。面试时建议画个DP表格辅助理解。

19. 零钱兑换(LeetCode #322)

难度:中等 | 考察点:完全背包

美团一面考的。dp[i]表示凑出金额i所需的最少硬币数,对每种硬币面值尝试更新。这是完全背包问题的变体——每种硬币可以使用无限次。面试官追问了"输出所有组合"的变体,那就要用回溯了。注意初始化dp[0]=0,其余为无穷大。

20. 0-1背包问题

难度:中等 | 考察点:经典DP模型

字节一面考的。给定物品重量和价值,在容量限制下求最大价值。dp[i][j]表示前i个物品在容量j下的最大价值,每个物品选或不选。空间优化到一维时要注意逆序遍历,否则会重复选取。面试官还问了分割等和子集(#416),本质就是0-1背包。

21. 最长公共子序列(LeetCode #1143)

难度:中等 | 考察点:二维DP

腾讯一面考的。dp[i][j]表示text1前i个字符和text2前j个字符的LCS长度。字符相等则dp[i][j]=dp[i-1][j-1]+1,否则取上方和左方的最大值。面试官让我还原LCS的具体内容,需要从dp表格回溯。这道题和编辑距离的DP结构很相似,建议对比学习。

五、图论(4题)

22. 岛屿数量(LeetCode #200)

难度:中等 | 考察点:DFS/BFS/并查集

阿里和字节都考了。遍历网格,遇到'1'就启动DFS/BFS把相连的'1'全部标记为'0',计数加一。面试官还问了"最大岛屿面积"的变体。这道题也可以用并查集做,但代码量更大,面试时DFS最稳妥。

23. 课程表(LeetCode #207)

难度:中等 | 考察点:拓扑排序/环检测

美团二面考的。本质是判断有向图是否有环。用BFS+入度数组做拓扑排序,或者用DFS做环检测。面试官追问了"输出修课顺序"(#210),就是拓扑排序的完整版本。这道题在建图阶段容易出错——邻接表和入度数组要对应好。

24. 最短路径(Dijkstra算法)

难度:中等 | 考察点:贪心+优先队列

腾讯三面考了网络延迟时间(LeetCode #743),本质就是Dijkstra。用优先队列优化后时间复杂度O(ElogV)。面试官让我手写堆,我写了个简化版的优先队列。注意Dijkstra只适用于非负权图,如果有负权边要用Bellman-Ford。

25. 拓扑排序的应用

难度:中等 | 考察点:BFS拓扑排序

字节二面考了"外星词典"(LeetCode #269),需要从单词顺序推导字母顺序,本质还是拓扑排序。这道题的难点在于建图——如何从相邻单词中提取偏序关系。面试时我建图逻辑写错了,面试官给了提示才改对,这道题确实容易在建图环节翻车。

六、设计题(5题)

26. LRU缓存(LeetCode #146)

难度:中等 | 考察点:哈希表+双向链表

这道题是大厂最爱考的设计题,我面了字节、阿里、腾讯三家都问了。核心数据结构是哈希表+双向链表:哈希表O(1)查找,双向链表O(1)调整顺序。get时把节点移到链表头部,put时如果超容量就删除链表尾部。面试官会追问线程安全、分布式缓存等扩展问题。

27. 最小栈(LeetCode #155)

难度:中等 | 考察点:辅助栈

京东一面考的。用两个栈,一个存数据,一个存当前最小值。push时辅助栈压入当前最小值,pop时两个栈同时弹出。面试官追问了"能不能只用一个栈",可以用差值法——存储当前值与最小值的差,但代码可读性差,面试时不推荐。

28. 用栈实现队列(LeetCode #232)

难度:简单 | 考察点:双栈模拟

美团一面考的。两个栈,一个输入栈一个输出栈,push进输入栈,pop时如果输出栈为空就把输入栈全部倒入输出栈。面试官问了均摊时间复杂度——每个元素最多被搬运两次,均摊O(1)。变体题是用队列实现栈(#225)。

29. 前缀树/Trie(LeetCode #208)

难度:中等 | 考察点:树形数据结构设计

阿里二面考的。每个节点包含26个子节点指针和一个isEnd标志。insert逐字符插入,search逐字符查找。面试官追问了"实现自动补全"——在前缀树基础上做DFS输出所有以该前缀开头的单词。这道题的代码量不小,面试时建议先说思路再写代码。

30. 跳表(Skip List)

难度:困难 | 考察点:概率数据结构

字节三面考的。跳表是Redis中有序集合的底层实现之一,面试官直接问"手写跳表的插入操作"。核心思想是通过多层索引实现O(logn)查找,每个节点以概率p晋升到上层。我之前只了解原理没手写过,现场写得磕磕绊绊,最后面试官说"思路对就行"。

要点:跳表不是LeetCode上的题,但大厂面试确实会考,尤其是和Redis相关的岗位。建议理解原理,至少能画出插入和删除的过程。

面试真题汇总表

下面是我整理的30道题速查表,方便大家快速定位薄弱环节:

数组/字符串:两数之和(#1,简单)、三数之和(#15,中等)、最长子串(#3,中等)、合并区间(#56,中等)、滑动窗口最大值(#239,困难)、旋转数组(#189,中等)

链表:反转链表(#206,简单)、合并有序链表(#21,简单)、环形链表(#141/142,简单/中等)、K个一组翻转(#25,困难)

树:层序遍历(#102,中等)、最大深度(#104,简单)、路径总和III(#437,中等)、最近公共祖先(#236,中等)、验证BST(#98,中等)

动态规划:爬楼梯(#70,简单)、最长递增子序列(#300,中等)、编辑距离(#72,困难)、零钱兑换(#322,中等)、0-1背包(中等)、最长公共子序列(#1143,中等)

图论:岛屿数量(#200,中等)、课程表(#207,中等)、最短路径(#743,中等)、拓扑排序应用(#269,中等)

设计题:LRU缓存(#146,中等)、最小栈(#155,中等)、用栈实现队列(#232,简单)、前缀树(#208,中等)、跳表(困难)

心得体会与建议

1. 刷题要有策略,不要盲目追求数量。我前期刷了200多道题,但很多是同类型的重复练习。后来改成按分类刷,每个类型重点攻克3-5道经典题,效果反而更好。30道高频题吃透了,比刷100道杂题管用。

2. 面试时先说思路,再写代码。我吃过亏——字节二面时直接开写,写到一半发现思路有问题,推倒重来时间就不够了。后来养成习惯:先花2-3分钟和面试官确认思路,确认没问题再写,效率高很多。

3. 重视变体题和追问。面试官很少只问原题,几乎都会追问变体。比如两数之和追问三数之和,反转链表追问区间反转,层序遍历追问之字形。准备的时候要把常见变体一起练了。

4. 简单题也要认真准备。很多人觉得简单题不用练,但面试时简单题往往是开场,写得不流畅会直接影响面试官的第一印象。而且简单题的追问可能比难题还刁钻。

5. 时间复杂度和空间复杂度要主动分析。写完代码后不要等面试官问,主动说出时间和空间复杂度,以及有没有优化的可能。这是加分项。

常见问题FAQ

Q:30道题够用吗?需要刷多少道才能应付大厂面试?

A:30道高频题是核心,但建议总共刷到80-100道左右,覆盖常见题型。质量比数量重要,每道题要理解原理而不是背答案。

Q:刷题顺序怎么安排?

A:建议先数组/字符串→链表→树→动态规划→图论→设计题。由易到难,每类先做简单题建立信心,再做中等和困难题。

Q:面试时算法题写不出来怎么办?

A:千万别沉默。先说你能想到的暴力解法,然后和面试官讨论优化方向。面试官通常会给出提示,能跟着提示写出最终解法也是可以的。

Q:需要刷LeetCode周赛吗?

A:有时间的话可以参加,锻炼限时做题能力。但周赛的题偏竞赛风格,和面试题的风格不完全一致,优先刷高频题。

Q:动态规划总是想不出状态转移方程怎么办?

A:这是正常现象。建议从最简单的爬楼梯开始,逐步过渡到背包、子序列类问题。每道DP题都画状态转移表格,理解清楚dp数组的含义和转移逻辑,比背模板有效。

#算法面试#大厂面试#LeetCode#面试真题