編者按:本文來自逆行求職(ID:nixingjihua)。
對所有求職技術崗位的童鞋來說,有這麼一樣東西恐怕做夢都會夢到【Leetcode】,繞都繞不過去的程式設計師刷題神器。
「哲學是世界觀和方法論的統一,是具體科學知識的概括與總結。」
今天,逆行君就帶你從世界觀和方法論兩方面走進「leetcode」
簡單來說,leetcode是一個美國的在線編程網站,它收集了各大公司的經典算法面試題,用戶可以選擇不同的語言進行代碼的在線編寫、編譯和調試。
Leetcode目前有450題(依稀記得去年還只有340多道啊),分為三個難度easy、medium、和hard。題目大致分為兩類:
1、基礎算法的知識。
這些題裡面有大量的算法題,解這些題都是有套路的,不是用遞歸(例如深度優先DFS,廣度優先BFS),就是要用動態規劃(Dynamic Programming),或是拆半查找(Binary Search),或是回溯(Back tracing),或是分治法(Divide and Conquer),還有大量的二叉樹,數組、鍊表、字符串和hash表的操作。通過做這些題能讓你對這些最基礎的算法的思路有非常紮實的了解和訓練。
2、編程題。比如:atoi,strstr,add two num,括號匹配,字符串乘法,通配符匹配,文件路徑簡化,Text Justification,反轉單詞等等,這些題的Edge Case,Corner Case有很多。這些題需要你想清楚了再做,只要你稍有疏忽,就會有幾個case讓你痛不欲生,而且一不小心就會讓你的代碼會寫得又臭又長,無法閱讀。通過做這些題,可以非常好的訓練你對各種情況的考慮,以及你對程序代碼組織的掌控(其實就是其中的狀態變量)。
Leetcode是注重算法的刷題工具,在考算法的筆試面試中,碰見原題的概率可算是非常大:
@飛龍:面試向算法,感覺沒有比leetcode更合適的訓練方法了。短期刷用處也很大,如果你對代碼有感覺的話,一些巧妙的解法你看一眼就會忘不了。
@anonymity:參加了一些公司的筆試,看到過leetcode上的原題或近似題。最後,從了某公司的美國總部軟體工程師的offer。學生們項目經驗少,只能考算法。刷題很有用。
@yuquan wang:
會leetcode,不一定能拿offer
不會leetcode,基本拿不了offer.
leetcode之方法論簡而言之,就是,leetcode到底要怎麼刷?
刷題的順序,可以按不同的難度等級練習,先把easy的題目練完,再進階medium,最後的hard就量力而為。廣度優先的練習會讓你快速掌握大部分題型,這樣應對突發的面試筆試需求也可以信心十足,不會出現還沒有練過的地方。
還不錯是不是。
不過按Tag來刷,也可能會在慣性思維下,去想關於Tag的算法。比如138. Copy List with Random Pointer(深拷貝鍊表),Tag:Hash Table。儘管是一個hard的題目,但是已經提示hash表,怎麼樣都會想到建立映射關係(而且目前最好的解法並不是使用的hash table)。
最後提供一種綜合性思路,也就是在各個Tag分類裡按不同的難度刷題,這樣就既有廣度也有深度了。
我們還想給你一些小技巧
01 善用Github
不少人都會一邊做Leetcode的題目一邊在Github上repo,這樣不僅對自己的解題思路有所記錄,還能方便查找。不少刷Leetcode的高手,他們的答案也是寫在自己的Github上,你也可以通過Github成功找到他們。
同一道題的解法往往不止一種,甚至思路和方式都會完全不同,例如這位同學所說:「邊刷邊感嘆天外有天,比如有道很簡單的一個int array只有一個數隻出現了一次,其他數都是出現了兩次,找出只出現一次的數。看到討論區的答案是把所有element XOR起來,頓時膜拜」 所以一般很簡單的題,也有必要看看討論區的優秀答案,畢竟提升自己的算法水平才是正義目標啊。
重點,90%同學都不知道的討論區在的正確打開方式:
從每道題目下方的Discuss按鈕裡點進去,才是每道題對應的討論!
03 徒手寫代碼的能力
很多同學在Leetcode上編得風生水起,但在筆試面試中遇到面試官拿出一張A4白紙,可能就懵逼了,改改塗塗半天寫不完整。這個時候徒手寫代碼的能力就尤為突出了,無論你是先手寫完代碼再敲到網頁上,還是代碼AC(通過)後再默寫一遍,徒手代碼能力都是值得訓練的,這也是你的整體思維和架構能力的體現。
有很多同學由於實習或者其他原因沒有辦法拿出大段時間來刷leetcode,這裡為實習/工作/研究僧提供一個「一天一題時間表」:
1、早上起來出門前,迅速看一道題。
2.在擁擠的交通工具上,超脫自己,「冥想」題目。
3. 題目so easy,手機提交。
4. 短時不能通關?那就一直放在腦子裡面想,到了公司/實驗室,基本答案就可以動動手寫在電腦上了。
5. 如前文所說,將思路和解決方案放到github上。
6. 晚上睡覺前,反思一下是不是最優解法,有時間的話看看discuss,沒時間,把自己的解法理順了,涉及的知識點再過一遍腦子。
對於基礎不紮實的菜鳥選手,逆行君並不推薦按照前面提示的難度/tag進行刷題操作,有可能受思維暗示的影響不說,效率也會比較低下。
第一次刷,首先攻克array,string,tree,linkedlist,math這五個tag,好處在於可以迅速的在規避思維暗示的同時,迅速鞏固數據結構的知識,或許還能掌握某種數據結構的小技巧。
每個tag內部就按照easy-medium-hard的順序做,這樣最開始一天刷10道easy,後面熟了這個數據結構一天也能刷5道難題,不會在初期被挫的刷不下去,培養一種刷題的「爽」感。
這個順序完成之後,你已經完成了25%以上的進度條了,之後翻轉順序,從hard向easy進行刷題,開始會有點小虐,但後面就會效率奇高。刷完第一遍之後,就可以愉快的進行全tag刷題round 2了~
免費題解在這裡
為了保證大家的刷題心情,大部分的題目的答案整理及分析,我們都給準備好了,畫風是這樣:
更多題解可以關注逆行求職(id:nixingjihua),回復leetcode獲得。