某位工業(yè)界的朋友談到最近刷leetcode有點(diǎn)累, 遂和我探討刷題的問(wèn)題.
我感覺(jué), 刷題是參加競(jìng)賽的同學(xué)的主業(yè), 拼手速拼熟練程度, 要打怪自然要勤刷. 業(yè)精于勤而荒于嬉, 這是一個(gè)自然的道理. 為何中國(guó)乒乓球隊(duì)長(zhǎng)盛不衰? 就是因?yàn)樗麄兲焯焖⒏呔獾膭?dòng)作, 而且戰(zhàn)術(shù)上又有多年傳承, 前三板對(duì)手的所有變化基本都算在腦海中, 這樣能不贏嗎?
但是進(jìn)入職場(chǎng)的朋友為何不要這樣刷題呢? 我談一些自己的淺見(jiàn), 或者說(shuō)什么才是真正的刷算法:
- 算法題很多是人造題, 應(yīng)用場(chǎng)景不夠. 許多特定限制的題, 規(guī)定了數(shù)據(jù)的形態(tài)和范圍, 但是這樣的題在每天寫的代碼中根本看不到, 也沒(méi)有刷的必要. 就比如說(shuō)沒(méi)事做一些繞來(lái)繞去的小學(xué)奧數(shù)題, 這樣對(duì)數(shù)學(xué)思維沒(méi)有什么太大的鍛煉價(jià)值.
- 有些技術(shù)是屠龍之術(shù), 看似很美好但根本用不著. 就比如說(shuō)在單鏈表中刪除當(dāng)前結(jié)點(diǎn)用后一個(gè)結(jié)點(diǎn)來(lái)代替(實(shí)際上刪除的是后一個(gè)結(jié)點(diǎn)), 這種技術(shù)實(shí)在沒(méi)什么太大意義. 而且, 它沒(méi)法刪除鏈尾結(jié)點(diǎn)啊!
- 業(yè)務(wù)邏輯簡(jiǎn)化更重要. 有刷算法題的時(shí)間, 不如把今天寫的代碼再精簡(jiǎn)重構(gòu)一下. 用一下數(shù)理邏輯的技術(shù), 簡(jiǎn)化或者合并邏輯判斷, 讓代碼更清晰可讀并且沒(méi)有邏輯錯(cuò)誤, 這樣豈不是更好嗎? 所以, 多寫一點(diǎn)Solid Code吧!
- 多看點(diǎn)算法書. 很多人連哪個(gè)漸近記號(hào)更快都沒(méi)有搞清楚, 就急著去刷題, 這樣也是不合適的. 看懂這個(gè)是基本要求, 你連這個(gè)都不懂如何進(jìn)步呢?
- 結(jié)合實(shí)際場(chǎng)景建立模型. 現(xiàn)實(shí)中的難題, 重要的是要將它轉(zhuǎn)換到某個(gè)算法問(wèn)題上去, 然后再去尋找現(xiàn)有的解決方案. 最簡(jiǎn)單的例子就是, 反正大多數(shù)人也寫不好紅黑樹(shù), 何不老老實(shí)實(shí)用
set
容器呢? 當(dāng)然, 這里安利一本我翻譯的《算法設(shè)計(jì)指南》(The algorithm design manual), 多看看這本書能讓你找到很多算法問(wèn)題.