大廠面試必考的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#面試#刷題