目錄
一、LeetCode簡介
二、刷leetcode的主要目的
三、常用的數據結構
四、常用的算法思想
五、選擇算法題
1、刷題選擇
2、刷題方法
方法一:順序法
方法二:標簽法
方法三:隨機法
方法四:必殺法
六、刷題攻略
TIP 1:
TIP 2:
TIP 3:
TIP 4:
?
?
應屆生面試算法就考個數組 鏈表 二叉樹 矩陣 數組變著法子考你排序 查詢 指針 位運算 鏈表變著法子考你指針 最多再考個哈希 二叉樹變著法子考用遞歸和棧前中后遍歷 最多加上回溯 矩陣的話就是知道起點的路徑查詢和不知道起點的路徑查詢 掌握了這些面大廠就比較輕松了,其實和學歷技術關系也不大 大部分人先死在了想都不敢想上。
一、LeetCode簡介
據了解,LeetCode 是一個非常棒的 OJ(Online Judge)平臺,收集了許多公司的面試題目。相對其他 OJ 平臺而言,有著下面的幾個優點:
- 題目全部來自業內大公司的真實面試
- 不用處理輸入輸出,精力全放在解決具體問題上
- 題目有豐富的討論,可以參考別人的思路
- 精確了解自己代碼在所有提交代碼中運行效率的排名
- 支持多種主流語言:C/C++,Python, Java
- 可以在線進行測試,方便調試
二、刷leetcode的主要目的
- 熟悉各互聯網公司的算法題目,為找工作做準備。
- 復習以前學過的編程語言,LeetCode支持幾乎所有主流編程語言,大家可以用不同語言來做題。
- 熟悉常見的算法和數據結構,LeetCode提供了交流平臺,一些大神會將自己的解法貼出來共享,有些巧妙的解法實在令人叫絕。
- 學習別人的編程思維,加快編程的速度,避免常見的BUG。
??另外LeetCode的題型都非常簡單明了,并不需要的復雜的理解,一般都在50行以內就可以解決了,如果你寫了上百行代碼,就肯定說明你想太多了或太復雜,雖然都能用很短的代碼就能解決,但并不意味著LeetCode的題目非常簡單,實際上LeetCode基本上涉及到了所有常規的算法類型。
? 刷 LeetCode 的最大好處就是可以鍛煉解決問題的思維能力,相信我,如何去思考本身也是一個需要不斷學習和練習的技能。此外,大量高質量的題目可以加深我們對計算機科學中經典數據結構的深刻理解,從而可以快速用合適的數據結構去解決現實中的問題。我們看到很多ACM大牛,拿到題目后立即就能想出解法,大概就是因為他們對于各種數據結構有著深刻的認識吧。
?
三、常用的數據結構
- Stack:簡單來說具有后進先出的特性,具體應用起來也是妙不可言,可以看看題目 32. Longest Valid Parentheses。
- Linked List:鏈表可以快速地插入、刪除,但是查找比較費時(具體操作鏈表時結合圖會簡單很多,此外要注意空節點)。通常鏈表的相關問題可以用雙指針巧妙的解決,160. Intersection of Two Linked Lists 可以幫我們重新審視鏈表的操作。
- Hash Table:利用 Hash 函數來將數據映射到固定的一塊區域,方便 O(1) 時間內讀取以及修改。37. Sudoku Solver 數獨是一個經典的回溯問題,配合 HashTable 的話,運行時間將大幅減少。
- Tree:樹在計算機學科的應用十分廣泛,常用的有二叉搜索樹,紅黑書,B+樹等。樹的建立,遍歷,刪除相對來說比較復雜,通常會用到遞歸的思路,113. Path Sum II 是一個不錯的開胃菜。
- Heap:特殊的完全二叉樹,“等級森嚴”,可以用 O(nlogn) 的時間復雜度來進行排序,可以用 O(nlogk) 的時間復雜度找出 n 個數中的最大(小)k個,具體可以看看 347. Top K Frequent Elements。
四、常用的算法思想
? 除了數據結構,具體算法在一個程序中也是十分重要的,而算法效率的度量則是時間復雜度和空間復雜度。對于一道編程問題,選用不同的數據結構和算法會得到不同的實現方式,比如“最長公共子串”。所以光能寫出問題的實現還不夠,還需要知道怎么針對問題設計算法,然后分析算法的復雜度來比較不同實現直接的優缺點。因此刷題之外,還需要記住每種算法實現的時間復雜度和空間復雜度。最常用的是Big O notation。一般情況下,人們更關注時間復雜度,往往希望找到比 O( n^2 ) 快的算法,在數據量比較大的情況下,算法時間復雜度最好是O(logn)或者O(n)。計算機學科中經典的算法思想就那么多,LeetCode 上面的題目涵蓋了其中大部分,下面大致來看下。
?
- 分而治之:有點類似“大事化小、小事化了”的思想,經典的歸并排序和快速排序都用到這種思想,可以看看 Search a 2D Matrix II 來理解這種思想。
- 動態規劃:有點類似數學中的歸納總結法,找出狀態轉移方程,然后逐步求解。 309. Best Time to Buy and Sell Stock with Cooldown 是理解動態規劃的一個不錯的例子。
- 貪心算法:有時候只顧局部利益,最終也會有最好的全局收益。122. Best Time to Buy and Sell Stock II 看看該如何“貪心”。
- 搜索算法(深度優先,廣度優先,二分搜索):在有限的解空間中找出滿足條件的解,深度和廣度通常比較費時間,二分搜索每次可以將問題規模縮小一半,所以比較高效。
- 回溯:不斷地去試錯,同時要注意回頭是岸,走不通就換條路,最終也能找到解決問題方法或者知道問題無解,可以看看 131. Palindrome Partitioning。
??當然,還有一部分問題可能需要一些數學知識去解決,或者是需要一些位運算的技巧去快速解決。總之,我們希望找到時間復雜度低的解決方法。為了達到這個目的,我們可能需要在一個解題方法中融合多種思想
———————————————————————————————————————————
?
五、選擇算法題
點開Algorithms后,我們可以看到一列題目的列表,每個題目都有獨一無二序號,后面的接受率(Acceptance)表示提交的正確率,Difficulty表示難易程度。
LeetCode按難易程度分成了:Hard、Medium、Easy三個級別。
- Easy級別一般并不需要太多思考就可以想到算法,甚至可以通過直接的方式,特別適合新手去熟悉編程語言。
- Medium級別就會有些難度,一般都會涉及到經典的算法,需要一定的思考。
- Hard級別是最難的,有些時候是算法本身的難度,有些時候特別需要你考慮到各種細節。
?
1、刷題選擇
盲目刷題不可取,因此,刷題要一定要搞清楚刷題的目的和原因。其實無外乎4種:
- 如果想提升自己的思維能力,可以按照AC率(Accepted)由低到高二分查找匹配自己當前水平難度的題目,然后適當挑戰高難度題(二分時間復雜度是O(logn),至少比從易到難的O(n)節省時間)
- 如果想鞏固某一專題,那自然應該按照tag來刷題,但是因為所用的方法在求解前已知,不太利于思維能力的提升
- 如果什么都不懂,那么建議隨機刷題,一來可以漲見識,二來進步空間比較大
- 如果想提高AC率或者增加自信,那么建議刷水題
人與人之間還是有天賦差別的,但區別在于經驗可以慢慢積累、再有個建議,題目如果太難超過當前自己能力的話,嘗試一定時間后還是老老實實看題解吧
?
2、刷題方法
方法一:順序法
建議未刷過題的新人按著順序(AC)來,前 150 題覆蓋了很多經典題目和知識點,指針法類如『3 sum』系列,動規類如『regex matching』,搜索類題目如『Sodoku Solver』。
基本熟悉知識點(圖、樹、堆、棧、鏈表、哈希表、記憶搜索、動態規劃、指針法、并查集等)后,可以一類類標簽強攻。Leetcode 右側的標簽系統雖然未必 100% 完整,但是大致分類做得還不錯。
面試前的一個月可以只做『Hard』標簽的題目,因為一般兩遍之后對于大部分『Medium』難度以下的題目都是肌肉記憶了。多練習『Hard』類題目可以讓自己的思路更開闊,因為很多題目使用的奇淫巧技讓人驚訝,比如 Leetcode 精心設計連續題號的『84. Largest Rectangle in Histogram』、『85. Maximal Rectangle』。
方法二:標簽法
按照網站給大家排列的不同tags,起到模塊化的復習和學習作用。舉個例子:比如復習鏈表的內容,就選Linked List這部分的23個題目。刷完之后可以再總結一下常用的方法和數據結構與構造方式。請不要為了刷題而刷題,一定是為了彌補一部分的知識去做。
?
方法三:隨機法
隨心所欲的選擇難度與刷題順序,哪個順眼做哪個。本方法只適合業余編程,不從事本行業的同學以及大神級人物
?
方法四:必殺法
leetcode是有公司題庫的,一句話:面哪家,刷哪家
?
六、刷題攻略
?
TIP 1:
眾所周知,上古時期號稱刷完leetcode所有題的大神,只不過是因為當時只有150道。而截至2018年1月,leetcode已經有700道題,且部分難度不小。要全部刷完,除了浪費你自己的時間,似乎找不到別的目的。
因此,對于大多數人來說,沒有時間也沒有必要把所有題目都做一遍(時間充裕可以隨意)。可以考慮序號為前250位的題目,因為那些全是經典與必考題。
TIP 2:
善用收藏夾,要養成『一道題第二次練習尚不能解就加入收藏夾』的習慣,且需要定期清空收藏夾:每道題不需提示下通過兩次后才能移出收藏夾。只想要答案的話很容易,題目評論區五花八門的答案,動不動就秀 python 一行代碼解決,有那么多人點贊。問題是,你去做算法題,是去學習編程語言的奇技淫巧的,還是學習算法思維的呢?你的快樂,到底源自復制別人的一行代碼通過測試,已完成題目 +1,還是源自自己通過邏輯推理和算法框架不看答案寫出解法?經典題目不是刷一遍就完事的,要刷很多遍,因為大家在刷某個專題的時候,一定會忘一些之前的知識,例如刷到了貪心,可能回溯就已經有點想不起來了。所以一定要多刷,加深記憶,然后面試之前一段時間就開始看各個專題的總結篇,進行快速回顧。
TIP 3:
可以按照下文的面試出題頻率順序來做,從頻率最高的一批開始。?而且請盡量不使用IDE,直接在平臺上寫代碼。?
面試前可以購買會員,按照公司的標簽來練習,也可以結合白板練習。面試前如果時間緊迫,那么練習的優先級分別是:即將面試公司的題目、收藏夾里的舊題目、剩余的新題。
沖刺階段的練習請盡量不要打開題型標簽,給自己思考的空間。如果真的刷了三遍以上還沒法達到理想目標,那么一定是學習方法出了問題,請多總結。
TIP 4:
寫好代碼先不要提交,人工檢查一下代碼,比如分號是否都有寫,return有沒少等。?人工檢查完后使用“Custom Testcase”功能自定義測試用例,注意檢查邊界,然后“Run Code”,這步可以發現蠻多問題的。??等RunCode通過后,再去提交。
?
?