大廠技術面常見算法題整理: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#面試真題