僅以本文總結搞定算法面試的方法和如何使用Leetcode刷題方法,記錄自己的想法也能幫助到有需要的同學。
為什么要學習算法
在了解如何學習算法和有效刷題之前首先思考一分鐘學習算法和刷題的目的。
最簡單的原因是軟件工程師工作面試會考察面試者能否寫出給定問題的解決方案。更重要的是算法作為對復雜問題的抽象是計算機科學很重要的一部分。只有數量掌握了算法和數據結構,才能寫出更好的代碼。比如我最近在學習UC Berkely 的CS 186時需要實現B+ Tree,因為有了算法的基礎,很快就能寫出代碼。記得mit 算法課程上說要成為一個好的coder的方法是每天寫代碼,并學習算法這門課。
本文主要針對如何解決面試中的算法題,至于算法內功心法部分有機會會在其他文章中記錄。
Leetcode Record.png
分類刷題
Leetcode題目有兩種分類方法,一是按照算法和數據結構類型分類,二是按照不同公司題目出現頻率分類。如果是基礎比較薄弱的同學,推薦先攻克不同類別的題目,在有一定基礎之后可以去刷心儀公司的高頻題。高頻題其實只是有一定的參考價值,如果能夠很好掌握每種類型的題目,則不論面試哪一家公司都會有很好的表現,所以不刷高頻題也是可以的。
根據算法和數據結構類型,可以分為這些主題:數組,鏈表(相關的指針操作,如雙指針),二分查找,棧,隊列,優先隊列,二叉樹(先序遍歷,中序遍歷,后序遍歷,迭代方法,循環方法),圖(BFS,DFS,拓撲排序),Trie,回溯,動態規劃等。
在學習數據結構和算法之前,需要先掌握算法的時間復雜度和空間復雜度,具體來說就是O標記。只有掌握了時間復雜度才會知道每種數據結構和算法的優勢是什么,結合數據結構和算法的特點才能在解決問題時選擇正確的數據結構。
解題順序
在了解了以什么順序進行進行學習之后,下面說明一下針對一道題目的解決思路。
- 先了解暴力求解方法再進行優化。如果連暴力求解方法也不知道,可能對于題目本身是沒有理解的。
- 沒有思路怎么辦?
- 看題目的解答和討論區學習解法
- 為什么會沒有思路呢?一個原因可能是這個題目用到了你不知道的數據結構,例如如果你沒有聽過Trie,那么自然不會解決使用Trie的題目了。另一種是雖然知道大概方向但是不能真正寫出代碼,這就需要多加練習啦
- talk is cheap, show me the code.
- 知易行難,在知道鏈表和真的寫出reverse一個鏈表之前還有這很長的距離,對于每一道練習的題目一定要落實到代碼上。
- 對于不會的題目即使是在理解了思路后抄一遍答案,以后回顧的時候在寫一遍也是有價值的。
- 先有思路再編碼。
- 想清楚edge case
- 回顧題目。對于解決的題目要有意識的進行回顧,尤其是沒有一次達到bug free,卡在思路和邊界條件上的題目。可以在學習完一個主題之后集中回顧。回顧時也要落實到代碼。