《劍指 Offer》作者是如何看待題海戰(zhàn)術(shù)的?

無論是計(jì)算機(jī)科班的應(yīng)屆畢業(yè)生,還是已經(jīng)有幾年工作經(jīng)驗(yàn)的程序員,找工作時(shí)都需要進(jìn)行一輪接一輪的面試,而編程面試則是其中的重頭戲。
從我這十幾年對(duì)程序員編程面試的觀察,我的結(jié)論是面試的難度在逐年增大,大家準(zhǔn)備面試所花費(fèi)的時(shí)間和精力也越來越多。
幾年前要是聽說誰為了準(zhǔn)備面試刷了 200 道力扣題 ??,大家都會(huì)驚為天人。現(xiàn)在每個(gè)應(yīng)聘者都在刷題,應(yīng)屆畢業(yè)生準(zhǔn)備面試刷 400 題基本上只能算是起步 ??。由于應(yīng)聘者刷題越來越熟練,程序員面試的標(biāo)準(zhǔn)自然也在水漲船高。
但我個(gè)人不喜歡也不建議題海戰(zhàn)術(shù)。我們真正需要的是 系統(tǒng)學(xué)習(xí) 并 深刻理解 不同數(shù)據(jù)結(jié)構(gòu)及算法的特征以及適用場(chǎng)景。
在真正掌握了每個(gè)數(shù)據(jù)結(jié)構(gòu)及算法的精髓之后,針對(duì)典型的面試題進(jìn)行必要的練習(xí),那么在面試的時(shí)候就能以不變應(yīng)萬變,不管遇到什么樣的面試題都能迎刃而解。幫助讀者系統(tǒng)學(xué)習(xí)并深刻理解不同數(shù)據(jù)結(jié)構(gòu)及算法的特征以及適用場(chǎng)景,是最近寫作《劍指 Offer(專項(xiàng)突破版)》這本書的初衷,幫助讀者在算法面試中能快速找到解題思路并寫出高質(zhì)量的代碼,則是我寫這本書的目的。

算法和數(shù)據(jù)結(jié)構(gòu)到底應(yīng)該怎么學(xué)?
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),首先要熟練掌握插入、刪除、查找等基本操作,這些基本操作往往是解決很多面試題的關(guān)鍵。
例如,如果我們熟練掌握了前綴樹的插入和查找操作,那么很多跟字符串前綴相關(guān)的問題都很容易解決。再比如,基于基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)如哈希表、鏈表等設(shè)計(jì)更加高級(jí)、復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(例如最近最少使用緩存)是近年來非常流行的面試題。其實(shí)這類題目也都是利用基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)高級(jí)數(shù)據(jù)結(jié)構(gòu)的插入、刪除、查找等操作。
同樣,對(duì)于基礎(chǔ)算法我們也需要深刻理解它們的原理以及實(shí)現(xiàn)的代碼。
例如,二分查找通常只需要 10 行左右的代碼就能實(shí)現(xiàn),我們要理解它的循環(huán)條件的比較運(yùn)算符什么時(shí)候是“<”,什么時(shí)候是“<=”,確定下一步應(yīng)該查找前半部分或者后半部分的標(biāo)準(zhǔn)是什么。理解了這些原理之后,不管面試題怎么變化,只要面試題是關(guān)于在排序(可能只是部分排序)數(shù)組中的查找問題,都可能基于二分查找解決,而最終解決問題的代碼都大同小異。
此外,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)還要深刻理解每種數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)及其適用場(chǎng)景,這樣才能在面試中合理選擇數(shù)據(jù)結(jié)構(gòu)解決問題。
例如,哈希表是時(shí)間效率非常高的數(shù)據(jù)結(jié)構(gòu),它的插入、刪除、查找操作的時(shí)間復(fù)雜度都是 O(1)。既然時(shí)間效率這么高,那是不是不管什么問題都能用哈希表解決?其實(shí)未必。
如果存儲(chǔ)的元素是字符串,而且需要根據(jù)字符串的前綴進(jìn)行查找,那么前綴樹是更好的選擇。如果存儲(chǔ)的元素是數(shù)字,并且解決問題需要知道數(shù)據(jù)集合里的最大值或者最小值,那么堆可能是更好的選擇。如果需要對(duì)動(dòng)態(tài)數(shù)據(jù)集合排序,并且需要根據(jù)數(shù)值的大小查找,那么平衡的二叉搜索樹(Java 中的 TreeSet 或者 TreeMap)可能是更好的選擇。

同樣,學(xué)習(xí)算法也要理解每種算法的特點(diǎn)及其適用場(chǎng)景。
例如回溯法和動(dòng)態(tài)規(guī)劃適合解決的問題看起來很類似。如果解決一個(gè)問題需要多個(gè)步驟,并且每個(gè)步驟都面臨多個(gè)選擇,那么我們可以考慮使用回溯法或者動(dòng)態(tài)規(guī)劃解決這個(gè)問題。如果問題要求列舉出問題所有的解,那么我們應(yīng)該采用回溯法解決問題。如果問題只是要求計(jì)算某個(gè)最優(yōu)解(通常是最大值或者最小值)或者計(jì)算解的數(shù)目(或者判斷解是否存在),那么我們應(yīng)該采用動(dòng)態(tài)規(guī)劃解決問題。
舉例而言,給你一個(gè)沒有重復(fù)數(shù)字的正整數(shù)集合,請(qǐng)找出所有元素之和等于某個(gè)給定值的所有組合。同一個(gè)數(shù)字可以在組合中出現(xiàn)任意次。如果面試官要求我們列舉出所有可能的集合,那么這是一個(gè)考查回溯法的問題。如果面試官要求我們計(jì)算符合條件的集合里最少包含幾個(gè)數(shù)字,即計(jì)算某個(gè)最優(yōu)解,那么這就變成了一個(gè)考查動(dòng)態(tài)規(guī)劃的問題了。

編程面試怎么準(zhǔn)備?
在準(zhǔn)備面試時(shí),要注重總結(jié)常用的解題思路。
例如,如果一個(gè)面試題提到與二叉樹層相關(guān)的概念,那么我們可以嘗試用廣度優(yōu)先搜索算法解決這個(gè)問題。再比如,如果關(guān)于圖的問題關(guān)注的是路徑的最短距離,那么可以采用廣度優(yōu)先搜索解決;如果面試題重點(diǎn)關(guān)注的是路徑本身,那么可能深度優(yōu)先搜索算法更加適合用來解決問題。
同時(shí)也建議大家在準(zhǔn)備面試時(shí)注重總結(jié)常用的代碼模板。
有一些經(jīng)典的數(shù)據(jù)結(jié)構(gòu)或者算法的實(shí)現(xiàn)代碼,我們可以將它們當(dāng)作模板用來解決很多相關(guān)的面試題。只要我們能夠理解這些模板里代碼的來龍去脈,這樣在面試中如果遇到類似的問題就能套用相應(yīng)的模板解決,輕松做到舉一反三。例如用并查集解決跟圖相關(guān)問題時(shí)合并和查找操作的代碼都大同小異,在合適的時(shí)候套用 union 和 findFather 兩個(gè)函數(shù)就能解決很多與圖相關(guān)的問題。
準(zhǔn)備編程面試不是一件輕松的事情。但如果我們既能深刻理解單個(gè)數(shù)據(jù)結(jié)構(gòu)和算法的原理以及實(shí)現(xiàn)代碼,并能橫向比較不同數(shù)據(jù)結(jié)構(gòu)和算法的特點(diǎn)以及應(yīng)用場(chǎng)景,注意總結(jié)常用的解題思路和代碼模板,那么必定能順利通過面試并最終拿到心儀 Offer。
當(dāng)然,光說不練終究是紙上談兵,想要真正系統(tǒng)學(xué)習(xí)和深刻理解面試必備的算法與數(shù)據(jù)結(jié)構(gòu)知識(shí),還需要實(shí)際的練習(xí)。
《劍指 Offer(專項(xiàng)突破版)》一書中的練習(xí)題皆可在力扣(LeetCode)本書專區(qū)實(shí)時(shí)在線練習(xí)。告別題海,掌握高效學(xué)習(xí)方法。

何海濤老師的新書《劍指 Offer(專項(xiàng)突破版)》現(xiàn)已上架,49元包郵優(yōu)惠中,欲購從速~

不可錯(cuò)過的內(nèi)部特惠價(jià)
49元包郵
快快掃碼下單吧!
~心儀的Offer在向你招手~
![]()
如果喜歡本文 歡迎 在看丨留言丨分享至朋友圈 三連
熱文推薦
▼點(diǎn)擊閱讀原文,查看本書詳情~
