大廠技術面常見算法題整理: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數組的含義和轉移邏輯,比背模板有效。