資源描述:
《程序員面試時(shí)如何回答算法問(wèn)題》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、程序員面試中,很多算法設(shè)計(jì)問(wèn)題,都是歷年來(lái)各家企業(yè)的“炒現(xiàn)飯”,不管求職者以前對(duì)算法知識(shí)學(xué)習(xí)得是否扎實(shí),理解得是否深入,只要面試前買(mǎi)本《程序員面試筆試寶典》(備注:編者早前編寫(xiě)的一本書(shū),機(jī)械工業(yè)出版社出版),學(xué)習(xí)上一段時(shí)間,牢記于心,應(yīng)付此類題目完全沒(méi)有問(wèn)題,但遺憾的是,很多世界級(jí)知名企業(yè)也深知這一點(diǎn),如果純粹是出一些毫無(wú)技術(shù)含量的題目的話,對(duì)于考前“突擊手”而言,可能會(huì)占盡便宜,但對(duì)于那些技術(shù)好的人而言是非常不公平的。所以,為了把優(yōu)秀的求職者與一般的求職者能夠更好地區(qū)分開(kāi)來(lái),他們?cè)絹?lái)越傾向于出一些有技術(shù)含量的“新”題,這些題目以及答案,不再是以
2、前的陳谷子爛芝麻了,而是經(jīng)過(guò)精心設(shè)計(jì)的好題。在程序員面試中,算法的地位就如同是GRE或托??荚囋诔鰢?guó)中的地位一樣,必須但不是最重要的,它只是眾多考核方面中的一個(gè)而已,不一定就能決定求職者的生死。雖然如此,但并非說(shuō)明就不用去準(zhǔn)備算法知識(shí)了,因?yàn)樗惴ㄖR(shí)回答得好,必然會(huì)成為面試的加分項(xiàng),對(duì)于求職成功,百利而無(wú)一害。那么如何應(yīng)對(duì)此類題目呢?很顯然,編者不可能將此類題目都在《程序員面試筆試寶典》中一一解答,一來(lái)由于內(nèi)容眾多,篇幅有限,二來(lái)也沒(méi)必要,今年考過(guò)了,以后一般就不會(huì)再考了,不然還是沒(méi)有區(qū)分度。編者以為,靠死記硬背肯定是行不通的,解答此類算法設(shè)計(jì)問(wèn)
3、題,需要求職者具有扎實(shí)的基本功以及良好的運(yùn)用能力,編者無(wú)法左右求職者的個(gè)人基本功以及運(yùn)用能力,因?yàn)檫@些能力需要求職者“十年磨一劍”地苦學(xué),但編者可以提供一些比較好的答題方法和解題思路,以供求職者在面試時(shí)應(yīng)對(duì)此類算法設(shè)計(jì)問(wèn)題?!笆谥贼~(yú)不如授之以漁”,豈不是更好?(1)????歸納法此方法通過(guò)寫(xiě)出問(wèn)題的一些特定的例子,分析總結(jié)其中一般的規(guī)律。具體而言就是通過(guò)列舉少量的特殊情況,經(jīng)過(guò)分析,最后找出一般的關(guān)系。例如,某人有一對(duì)兔子飼養(yǎng)在圍墻中,如果它們每個(gè)月生一對(duì)兔子,且新生的兔子在第二個(gè)月后也是每個(gè)月生一對(duì)兔子,問(wèn)一年后圍墻中共有多少對(duì)兔子。使用歸納
4、法解答此題,首先想到的就是第一個(gè)月有多少對(duì)兔子,第一個(gè)月的時(shí)候,最初的一對(duì)兔子生下一對(duì)兔子,此時(shí)圍墻內(nèi)共有兩對(duì)兔子。第二個(gè)月仍是最初的一對(duì)兔子生下一對(duì)兔子,共有3對(duì)兔子。到第三個(gè)月除最初的兔子新生一對(duì)兔子外,第一個(gè)月生的兔子也開(kāi)始生兔子,因此共有5對(duì)兔子。通過(guò)舉例,可以看出,從第二個(gè)月開(kāi)始,每一個(gè)月兔子總數(shù)都是前兩個(gè)月兔子總數(shù)之和,Un+1=Un+Un-1,一年后,圍墻中的兔子總數(shù)為377對(duì)。此種方法比較抽象,也不可能對(duì)所有的情況進(jìn)行列舉,所以,得出的結(jié)論只是一種猜測(cè),還需要進(jìn)行證明。(2)????相似法正如編者“年年歲歲花相似,歲歲年年仍單身”
5、一樣,此方法考慮解決問(wèn)題的算法是相似的。如果面試官提出的問(wèn)題與求職者以前用某個(gè)算法解決過(guò)的問(wèn)題相似,此時(shí)此刻就可以觸類旁通,嘗試改進(jìn)原有算法來(lái)解決這個(gè)新問(wèn)題。而通常情況下,此種方法都會(huì)比較奏效。例如,實(shí)現(xiàn)字符串的逆序打印,也許求職者從來(lái)就沒(méi)遇到過(guò)此問(wèn)題,但將字符串逆序肯定在求職準(zhǔn)備的過(guò)程中是見(jiàn)過(guò)的。將字符串逆序的算法稍加處理,即可實(shí)現(xiàn)字符串的逆序打印。(3)????簡(jiǎn)化法此方法首先將問(wèn)題簡(jiǎn)單化,例如改變一下數(shù)據(jù)類型、空間大小等,然后嘗試著將簡(jiǎn)化后的問(wèn)題解決,一旦有了一個(gè)算法或是思路可以解決這個(gè)被“閹割過(guò)”的問(wèn)題,再將問(wèn)題還原,嘗試著用此類方法解決
6、原有問(wèn)題。例如,在海量日志數(shù)據(jù)中提取出某日訪問(wèn)xxx網(wǎng)站次數(shù)最多的那個(gè)IP。很顯然,由于數(shù)據(jù)量巨大,直接進(jìn)行排序不可行,但如果數(shù)據(jù)規(guī)模不大時(shí),采用直接排序不失為一種好的解決方法。那么如何將問(wèn)題規(guī)模縮小呢?于是想到了Hash法,Hash往往可以縮小問(wèn)題規(guī)模,然后在“閹割過(guò)”的數(shù)據(jù)里面使用常規(guī)排序算法即可找出此問(wèn)題的答案。maintenancemeasures,thereisabigsecurityrisk,managementhashadagreatimpacttothecity.3.1-8busterminalstationstatusinYib
7、incitylayouts(4)hoursofoperationmostofYibincitybuslinesin5:30-6:20,andbasicallymeettheYibintravelneeds.Bus(4)????遞歸法為了降低問(wèn)題的復(fù)雜度,很多時(shí)候都會(huì)將問(wèn)題逐層分解,最后歸結(jié)為一些最簡(jiǎn)單的問(wèn)題,這就是遞歸。此種方法,首先要能夠解決最基本的情況,然后以此為基礎(chǔ),解決接下來(lái)的問(wèn)題。例如,在尋求全排列的時(shí)候,可能會(huì)感覺(jué)無(wú)從下手,但仔細(xì)推敲,會(huì)發(fā)現(xiàn)后一種排列組合往往是在前一種排列組合的基礎(chǔ)上進(jìn)行的重新排列,只要知道了前一種排列組合的各類組合
8、情況,只需要把最后一個(gè)元素插入到前面各種組合的排列里面,就實(shí)現(xiàn)了目標(biāo):即先截去字符串s[1…n]中的最后一個(gè)字母,生成所有s[1…n-1