Leetcode 編程訓練

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的開發模式,而你也進入了“平庸模式”。于是你就會出現下圖那樣的情況。

1.gif

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/articles/12052.html

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2030

(0)
s19930811s19930811
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • 馬哥教育網絡班21期+第六周課程練習

    1、描述計算機的組成及其功能 答: (1)計算機組成: 輸入(鍵盤)、輸出(顯示器),存儲器(硬盤),運算器,控制器(CPU) (2)實現功能:    1)文件系統    2)內存管理    3)網絡功能    4)進程管理    5)驅動程序 2、按系列羅列…

    Linux干貨 2016-08-15
  • 進程和計劃任務

    一、進程概念    內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、 安全功能等 v Process:  運行中的程序的一個副本(文件),是被載入內存的一個指令集合,在內存中運行,系統指定一個內存空間和PID編號;進程ID(Process ID ,PID )號碼被用來標記各個進程;存在生命周期 &nbsp…

    Linux干貨 2016-11-27
  • 優云Automation:實現IT服務彈性伸縮的利器

    隨著互聯網業務快速持續增長,IT資源使用量按需變化成為常態,這就要求信息部門能快速響應資源使用的變化要求,對運維提出不小挑戰。比如電商、在線教育等企業經常推出一些秒殺、搶紅包活動,在特定時間段對資源的利用處于高峰期,之后基本處于空閑。 幾年前,我們從申請采購到應用部署上線都只能人工操作,需要提前幾個月開始規劃。如今通過云平臺能很好實現資源按需動態管理,運維人…

    系統運維 2017-03-15
  • 網絡25期第一周作業

    一、計算機硬件的組成及功能 1、控制器       控制器負責從存儲器中取出指令,并對指令進行譯碼??刂破髦饕怯芍噶罴拇嫫鳌⒆g碼器程序計數器、操作控制器等組成。 2、運算器      運算器又稱算數邏輯單元,是計算機進行算術計算和邏輯計算的部件。 3、存儲器 &nbs…

    Linux干貨 2016-12-06
  • nginx

    Linux干貨 2016-10-30
  • 第七周

    創建一個10G分區,并格式化為ext4的文件系統 劃分分區 partxprobe:重讀分區表   建立文件系統,acl機制          掛載文件系統          寫文件 &nbs…

    Linux干貨 2016-12-11
欧美性久久久久