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 12:11
下一篇 2016-08-15 12:11

相關推薦

  • LVS_DR配置

    DR : 192.168.29.150 VIP:192.168.29.100 RS1: 192.168.29.110 VIP:192.168.29.100 RS2:192.168.29.120 VIP:192.168.29.100 RS 配置 1 配置VIP [root@local ~]# ifconfig lo:0 192.168.29.100 netma…

    2017-06-30
  • 用戶及相關權限命令

    2018-03-26

    2018-03-26
  • 任務計劃2

    [root@localhost app]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root/bin MAILTO=root   # For details see man 4 crontabs   # Example of job defi…

    Linux干貨 2017-05-15
  • shell中if條件字符串、數字比對,[[ ]]和[ ]區別

    今天學習shell, if條件流程控制,但發現if[ ]]和if[ ]什么時候用不是清楚,正好看到一篇文章,非常好,轉載,留個備份。 參考: http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731 http://blog.csdn.net/sunboy_2050/article/det…

    Linux干貨 2016-08-12
  • N26-第二周

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。(盜圖了,哈哈哈) 文件查看類命令:cat, tac, head, tail, more, less,touch    cat 查看文件內容   tac命令   反向查看文件內容  注:可對照上圖 分屏查看命令:more  …

    Linux干貨 2017-01-07
  • 正則表達式應用

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。    cp -a /etc/skel /home/tuser1    chmod g-x /home/tuser1…

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