大厂面试必考的15道算法题:按通过率排序的刷题清单

算法专题作者: 美历团队

精选15道大厂最高频算法面试题,按通过率排序,每题含LeetCode编号、难度、考察点和解题思路,覆盖80%以上算法考点。

大厂面试必考的15道算法题:按通过率排序的刷题清单

背景介绍

我刷了400多道LeetCode,面了字节、阿里、美团、快手、拼多多,发现大厂算法面试的题目高度集中。你不需要刷1000题,把这15道最高频的吃透,就能覆盖80%以上的算法考点。我按通过率从高到低排序,从易到难,每道题都附上LeetCode编号、难度、考察点和解题思路。建议你按顺序刷,每道题至少写两遍——第一遍理解思路,第二遍闭卷手写。

1. 两数之和(LeetCode #1,简单,通过率52%)

考察点:哈希表、数组遍历

题目:给定数组和目标值,找出和为目标值的两个数的下标。

解题思路:暴力法O(n²)能过但面试不够。用哈希表优化到O(n):遍历数组,对每个元素检查target-nums[i]是否在哈希表中,在则返回,不在则把当前元素加入哈希表。关键点:先查后存,避免同一个元素用两次。面试官会追问:如果有多个答案怎么办?题目保证唯一解。数组无序怎么办?哈希表不要求有序。

2. 反转链表(LeetCode #206,简单,通过率73%)

考察点:链表操作、指针

题目:反转一个单链表。

解题思路:迭代法——三个指针prev、curr、next,每次把curr.next指向prev,然后三个指针各前进一步。直到curr为null,返回prev。递归法——递归到链表末尾,回溯时反转指向。面试必问:迭代和递归的复杂度?都是O(n)时间和O(1)/O(n)空间。面试官会追问:反转链表的一部分怎么做?就是92题,加个区间判断。

3. 有效括号(LeetCode #20,简单,通过率41%)

考察点:栈、字符串处理

题目:判断括号字符串是否有效。

解题思路:用栈。遇到左括号入栈,遇到右括号检查栈顶是否匹配。遍历完栈为空则有效。优化:遇到左括号时,入栈对应的右括号,这样比较时直接判断是否相等。面试追问:最长有效括号子串怎么做?那是32题,用栈或动态规划,难度跳了两个级别。

4. 最大子数组和(LeetCode #53,中等,通过率55%)

考察点:动态规划、贪心

题目:找出数组中连续子数组的最大和。

解题思路:Kadane算法——维护当前子数组和cur和最大和res。如果cur小于0,丢弃之前的重新开始(cur=nums[i]);否则继续累加。每步更新res=max(res,cur)。时间O(n)空间O(1)。面试追问:如果要求返回子数组的起止位置?加两个指针记录。如果数组全负?Kadane算法天然处理——返回最大的那个负数。

5. 合并两个有序链表(LeetCode #21,简单,通过率67%)

考察点:链表操作、递归

题目:将两个升序链表合并为一个新的升序链表。

解题思路:迭代法——用dummy头节点,比较两个链表当前节点,小的接入结果链表,指针后移。一个链表遍历完,把另一个剩余部分接上。递归法——比较头节点,小的那个的next指向递归合并结果。面试追问:合并K个有序链表?用最小堆,每次取最小的头节点。时间O(nklogk)。

6. 二叉树层序遍历(LeetCode #102,中等,通过率65%)

考察点:BFS、队列

题目:按层遍历二叉树,返回每层节点值。

解题思路:BFS用队列。关键点:需要按层分组——每层开始时记录队列长度,循环该长度次出队,子节点入队。面试追问:自底向上层序遍历?结果reverse一下。之字形遍历?偶数层reverse。右视图?每层最后一个节点。这些变体都要会。

7. 爬楼梯(LeetCode #70,简单,通过率53%)

考察点:动态规划、递推

题目:每次爬1或2级台阶,爬到第n级有多少种方法?

解题思路:经典dp。dp[i]=dp[i-1]+dp[i-2],即斐波那契数列。空间优化:只存前两个值,O(1)空间。面试追问:如果每次可以爬1到m级?完全背包问题,dp[i]=sum(dp[i-j]) for j in 1..m。如果台阶有代价?746题,dp[i]=min(dp[i-1],dp[i-2])+cost[i]。

8. 买卖股票的最佳时机(LeetCode #121,简单,通过率58%)

考察点:动态规划、贪心

题目:只允许一次买卖,求最大利润。

解题思路:遍历数组,维护到目前为止的最低价格minPrice,每天计算利润prices[i]-minPrice,更新最大利润。时间O(n)空间O(1)。面试官必问系列:买卖两次呢?123题。无限次呢?122题,贪心。含冷冻期呢?309题,状态机dp。含手续费呢?714题。这系列6道题建议一起刷。

9. 最长回文子串(LeetCode #5,中等,通过率37%)

考察点:动态规划、中心扩展

题目:找出字符串中最长的回文子串。

解题思路:中心扩展法——以每个字符(和每两个字符之间)为中心,向两边扩展,记录最长回文。时间O(n²)空间O(1)。动态规划法——dp[i][j]表示s[i..j]是否回文,dp[i][j]=dp[i+1][j-1]&&s[i]==s[j]。时间O(n²)空间O(n²)。Manacher算法O(n)但面试不要求。面试追问:回文子串个数?647题,同样中心扩展。

10. 三数之和(LeetCode #15,中等,通过率36%)

考察点:排序、双指针、去重

题目:找出数组中所有和为0的三元组。

解题思路:先排序O(nlogn),固定第一个数,后面两个数用双指针。左指针从i+1开始,右指针从末尾开始,根据三数之和移动指针。关键点:去重——第一个数和前一个相同则跳过,找到答案后左右指针也要跳过重复值。面试追问:四数之和?18题,多一层循环。最接近的三数之和?16题,记录最接近target的值。

11. 无重复字符的最长子串(LeetCode #3,中等,通过率39%)

考察点:滑动窗口、哈希表

题目:找出不含重复字符的最长子串长度。

解题思路:滑动窗口——用Map记录字符最近出现的位置。右指针遍历字符串,如果当前字符在窗口内(map中有且位置>=左指针),左指针跳到该位置+1。每步更新最大长度。时间O(n)。面试追问:如果只含小写字母?用数组代替Map更高效。至多包含K个不同字符的最长子串?340题,用Map计数。

12. 合并区间(LeetCode #56,中等,通过率49%)

考察点:排序、区间操作

题目:合并所有重叠区间。

解题思路:按区间左端点排序,遍历区间,如果当前区间左端点<=结果最后一个区间的右端点,则合并(更新右端点为max);否则直接加入结果。面试追问:插入区间?57题,分三段处理。区间列表的交集?986题,双指针取交集。会议室?252题,判断区间是否重叠。

13. 岛屿数量(LeetCode #200,中等,通过率59%)

考察点:DFS/BFS、网格遍历

题目:统计网格中岛屿的数量。

解题思路:遍历网格,遇到'1'则岛屿数+1,然后DFS/BFS把相连的'1'都变成'0'(沉岛法)。DFS:递归四个方向。BFS:用队列。时间O(mn)。面试追问:最大岛屿面积?695题,DFS时计数。被包围的区域?130题,从边界DFS。岛屿的周长?463题,数学计算。

14. LRU缓存(LeetCode #146,中等,通过率42%)

考察点:哈希表+双向链表、设计

题目:实现LRU缓存,get和put均为O(1)。

解题思路:哈希表存key到节点的映射,双向链表维护访问顺序。get:找到节点,移到链表头部。put:如果key存在则更新值并移到头部;如果不存在则创建新节点加到头部,超容量则删除尾部。面试必考设计题——我在字节、阿里、美团都遇到了。面试追问:线程安全的LRU怎么实现?加锁或用ConcurrentHashMap。

15. 编辑距离(LeetCode #72,困难,通过率61%)

考察点:动态规划、字符串

题目:求将word1转换成word2的最少操作数(插入、删除、替换)。

解题思路:经典dp。dp[i][j]表示word1前i个字符变成word2前j个字符的最少操作数。状态转移:如果word1[i-1]==word2[j-1],dp[i][j]=dp[i-1][j-1];否则dp[i][j]=min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)分别对应删除、插入、替换。时间O(mn)空间O(mn),空间可优化到O(min(m,n))。面试追问:只允许插入和删除?替换操作去掉。两个字符串的删除操作?583题。

真题汇总

这15道题我在面试中遇到的频率统计:两数之和、反转链表、LRU缓存几乎每场必考;有效括号、最大子数组和、三数之和出现频率超过70%;编辑距离虽然标困难但通过率高,字节和阿里喜欢考。建议按本文顺序从1刷到15,每道题写2-3遍。

心得建议

1. 刷题不在多而在精,15道高频题吃透比刷100道走马观花有用。每道题至少写两遍,第二遍闭卷。

2. 重视变体,面试官很少原题出,但变体都是基于原题改的。比如反转链表→反转链表II,爬楼梯→完全背包,买卖股票系列。

3. 先说思路再写代码,面试算法不是默写,是交流。先和面试官确认理解,说清楚时间空间复杂度,再动手写。

4. 写完要测试,用边界用例跑一遍:空输入、单个元素、全相同、全负数等。面试官很看重你的验证习惯。

5. 不会的题别慌,先说暴力解法,再想优化。暴力解法也是分,比空白强十倍。我在字节三面时先写了O(n²)的三数之和,然后面试官提示优化到O(nlogn)。

FAQ

Q:算法要刷到什么程度?

A:简单题5分钟内写出,中等题15分钟内写出最优解,困难题能说出思路。大厂面试一般考简单到中等,字节偶尔考困难。

Q:只刷这15道够吗?

A:覆盖80%的考点,但建议再刷15-20道补充:快排/归并、二分查找、前缀和、拓扑排序、并查集等。总共30-35道足够应付大部分面试。

Q:用什么语言刷题?

A:后端用Java/Go/C++,前端用JavaScript/TypeScript。建议用面试岗位对应的主要语言。

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

A:1)先说暴力解法;2)分析暴力解法的问题;3)尝试优化方向;4)写伪代码也行。让面试官看到你的思维过程,比沉默强太多。

#算法#LeetCode#动态规划#双指针#BFS#面试#刷题