不管是新鮮人、老手或甚至是高階職位,都躲不了面試中的技術考試。而 Leetcode 這個網站收錄了業界所有公司的面試考題,對於軟體工程師來說,Leetcode 刷題幾乎可以說是面試必做的考前複習。然而在茫茫大海般的題庫中,如何才能最有效率的刷題?

開始刷題前,要注意什麼?

刷題是一個需要長時間專注但枯燥的過程,對大多數人來說,刷題不僅不有趣,甚至還有點痛苦。正因如此,在開始刷題前,最好先找到一個自己可以安靜工作並專注超過一小時的空間(也就是先把桌子整理乾淨,讓自己不會刷題到一半就分心去打掃房間)。

Google 軟體工程師 Siddhesh Suthar 建議,在刷題前最好要先找出一天之中,自己最清醒、最適合工作的時段。可能是清晨或深夜,也可以是上班前或下班後,全看個人的時間安排和身體狀況。

每天至少花 1-2 小時或每週 10-15 小時刷題,如果平日要上課或上班,那麼找出自己什麼時候能集中精力是最重要的。在刷題的這段時間,關掉所有社交軟體,將手機靜音 1 小時。

LeetCode 哪些題目最重要?

LeetCode 是全球最大的程式編寫題庫,題目超過 2000 題,且會定期更新題庫。

LeetCode 上的每個問題都可以標記一個或多個主題,包括 Array、HashTable、Tree 等數據結構, Greedy、Divide and Conquer、Sorting 等算法技術,或 Sliding Window、Depth First Search、Topological Sort 等程式模型。其中有半數的問題和陣列 Array 有關,約 25% 的題目和字串 String 相關。

然而,怎麼刷題才最有效率?

Leetcode 將面試常見的 100 道題目整理成一個列表,另外也有最受歡迎的 100 道題目,對於時間緊迫或是比較沒有時間慢慢刷題的人來說,可以直接從這兩份題庫單下手,快速掌握解題手感。

另外,付費版還根據 FAANG 等科技企業分別整理了一份題庫,讓想進入這些企業工作的工程師能初步掌握公司的面試風格和考點,並提前進行模擬練習,且這份列表會不斷進行更新。

如何正確地刷 Leetcode?

LeetCode 最大的問題在於缺乏組織性。雖然題庫中有大量的題目,但是由於數量龐大,常常讓人不知道從哪裡開始下手。如果做 200 題能達到和做 500 題一樣的效果,那應該沒有人會想做 500 題吧?

一般人通常會選擇相同主題的問題,例如先解決與 Arrays 相關的問題,然後再轉向其他主題。雖然這樣的解法能掌握相似的題型,但就少了解題的靈活性。

例如,許多問題可以透過 HashMaps 解決,但其實也可以透過不同的算法技術解決。正確解題的關鍵在於:將新問題歸類到已知問題的能力。這樣的思維不僅讓整個程式撰寫、面試準備過程更有趣,也可以大大增進刷題的效率。

1.  Two Pointer (Arrays, Strings, Fast & Slow Pointer)

Two Pointer 是蠻常聽到的一種解題技巧,也可以說是演算法的解題模板。 Two Pointer 又可以分為左右指標與快慢指標兩種,常被拿來用來做特定條件下的搜尋或是總和計算。

2.  Sliding Window (Arrays, Strings, Hash Tables)

Sliding Window 可以說是面試常見的必考題,是廣義的左右指標中的一種。這類問題一般需要用到雙指標來進行求解,且大多離不開主陣列和子陣列的關係。

3. Tree and Graph Depth First Search (Matrix Traversal)

大多數 Tree 和 Graph 的問題都可以使用深度優先搜索 (DFS) 來解決。深度優先搜尋是 Graph 中的經典演算法,它會儘可能地搜尋樹的分支。

4. Tree and Graph Breadth First Search (Queue, Subsets, Matrix Traversal, Topological Sort)

廣度優先搜索 (BFS) 是一種 Graph 的搜索演算法,是一種非常方便的模式。以 tree 來說,就是把同一深度的節點走完,再繼續向下一個深度搜尋,直到找到目的節點或遍尋全部節點,例如可用找出迷宮中最短路徑的出口。

大多數軟體工程師面試都包括 LeetCode 的問題,只要在面試前狂刷題、勤練習,認真花時間準備,絕對可以獲得相對應的投資回報。

本文開放合作夥伴轉載,參考資料:Medium(1) Medium(2)Medium(3)designgurusReddit,首圖來源:Unsplash