阿里技術大牛陳皓談如何通過Leetcode編程訓練準備技術面試(C++版的完整實現)

  Leetcode這個網站上的題都是一些經典的公司用來面試應聘者的面試題,很多人通過刷這些題來應聘一些喜歡面試算法的公司,比如:Google、微軟、Facebook、Amazon之類的這些公司,基本上是應試教育的功利主義。
我做這些題目的不是爲了要去應聘這些公司,而是爲了鍛鍊一下自己的算法和編程能力。因爲我開始工作的時候基本沒有這樣的訓練算法和編程的網站,除了大學裏的“算法和數據結構”裏的好些最基礎最基礎的知識,基本上沒有什麼訓練。所以,當我看到有人在做這些題的時候,我也蠢蠢欲動地想去刷一下。
於是,我花了3-4個月的業餘時間,我把Leetcode的154道題全部做完了。(這也是最近我沒有太多的時間來寫博客的原因,你可以看到我之前做的那個活動中有幾個算法題來自於Leetcode)有人說我時間太多了,這裏聲明一下,我基本上都是利用了晚上10點以後的時間來做這些題的。
LeetCode的題大致分成兩類:

1)基礎算法的知識。這些題裏面有大量的算法題,解這些題都是有套路的,不是用遞歸(深度優先DFS,廣度優先BFS),就是要用動態規劃(Dynamic Programming),或是拆半查找(Binary Search),或是回溯(Back tracing),或是分治法(Divide and Conquer),還有大量的對樹,數組、鏈表、字符串和hash表的操作。通過做這些題能讓你對這些最基礎的算法的思路有非常紮實的瞭解和訓練。對我而言,Dynamic Programming 是我的短板,尤其是一些比較複雜的問題,在推導遞推公式上總是有思維的缺陷(數學是我的硬傷),通過做了這些題後,我能感到我在DP的思路上有了很大的收穫。

2)編程題。比如:atoi,strstr,add two num,括號匹配,字符串乘法,通配符匹配,文件路徑簡化,Text Justification,反轉單詞等等,這些題的Edge Case, Corner Case有很多。這些題需要你想清楚了再幹,只要你稍有疏忽,就會有幾個case讓你痛不欲生,而且一不小心就會讓你的代碼會寫得又臭又長,無法閱讀。通過做這些題,可以非常好的訓練你對各種情況的考慮,以及你對程序代碼組織的掌控(其實就是其中的狀態變量)。還記得我在《函數式編程》中說的,程序中的狀態是你程序變得複雜難維護的直接原因。
我覺得每個程序員都應該花時間和精力做這些題,因爲你會從這些題中得到很大的收益。做完這些題後你一定會明白下面幾個道理:

1)想清楚了再幹。這個觀點我以前就在《多些時間可以少些代碼》說過。如果你拿到題就上去直接寫代碼的話,你一定會被各種case打回來了。然後呢,你一着急,你就會進入那種我在《開發團隊的效率》中說的那種毫無效率case by case的開發模式,而你也進入了“平庸模式”。於是你就會出現下圖那樣的情況。

Case-by-Case Development

2) 編程是腦力勞動,急不得。這個事情在這做這些題的時候你就會發現,要麼是腦子轉不過來了,要麼就是明明就差一點了,但程序怎麼都調不對。如果你越着急的話,你就會發現你會離目標越遠,而花的時間也會更多。另外,你會發現這些題基本上都是50行代碼內就可以搞定的,但是爲了這50行以內的代碼,你要花好多時間和精力。coding 50行代碼在我們的日常工作中分分鐘就完成,而Leetcode裏的50行代碼卻沒那麼簡單,也許,用這個你就可以區別什麼是碼農,什麼是程序員了。

3)加班要不得。因爲我總是在晚上10點以後做題,所以,基本上都是在加班狀態中工作。這種狀態過上兩三天,你就會發現,整個大腦已經不轉了,而且不但不轉,還會犯很多低級錯誤,很多事情都想不清楚,一個晚上都在和程序的狀態控制做搏鬥,代碼寫得越來越亂,越來越沒條理。於是這種時候,我都會休息幾天,不做題了,然後再做題的時候,就覺得非常地清楚。可見加班 是編程最致命的敵人!
我把我的C++代碼放到了Github上,大家也幫我review一下,看看有沒有可以改善的。

https://github.com/haoel/leetcode
好了,不多說了,我希望大家有時間都去練練LeetCode,無論是找工作還是對你的編程能力會有非常大的提高。
轉載自:http://coolshell.cn/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章