各位小伙伴,大家好。我是Google 的資深工程師 & 面試官,今天想跟大家聊一聊應(yīng)聘技術(shù)崗的一些事,包括一點(diǎn)經(jīng)驗(yàn)技巧,以及我整理出的必問必考的算法問題。根據(jù)經(jīng)驗(yàn),我精選了100道算法題目,希望大家能吃透、理解。我的想法是題目要刷,但不在多而在精,融匯貫通最好。
我想學(xué)習(xí)本課程的大多數(shù)小伙伴,都是有計(jì)劃進(jìn)軍大廠,想在某大廠發(fā)光發(fā)熱的熱血少年。而我在加入 Google 之前,也曾僅僅是某外包公司的合同工,有幸的是后來就職于某著名電商平臺(tái)。從外包公司到Google, 除了技術(shù)上要跟緊時(shí)代, 算法基礎(chǔ)是不能落下的。所以,今天重點(diǎn)來給大家講講怎么刷算法題,希望可以通過這個(gè)專欄,將我的心得與大家分享一二。
現(xiàn)在,先要與各位小伙伴一起厘清思路,從宏觀層面總覽本課程的目標(biāo)、計(jì)劃、重難點(diǎn)等。希望通過對(duì)本專欄的學(xué)習(xí),能為大家的面帶來幫助。
目標(biāo)篇
1)學(xué)會(huì)怎么刷? 2)吃透精選題 3)面試技巧
幾乎每個(gè)剛剛開始刷題的人都要問上一遍,我到底要刷多少題呢?答案是顯而易見的:題目在于質(zhì)量,而不在數(shù)量。刷題的目的在于提升分析、建模、解決問題的能力,而不是盼望著面試時(shí)能夠遇上原題。為了提升自己的能力,我們更需要科學(xué)地訓(xùn)練與反思,而不是盲目地追求題目的數(shù)量。
如果非要給出一個(gè)數(shù)字,那我認(rèn)為100題左右也就夠了。在專欄中,我將與大家分享我的刷題經(jīng)驗(yàn)與思考,伴隨著課程講解,還會(huì)穿插一些面試中溝通和問答的技巧分享。這套方法曾經(jīng)幫助數(shù)十位同學(xué)進(jìn)入Google / Facebook / Microsoft / Oracle / Amazon / 字節(jié)跳動(dòng)等一線科技公司,希望也能幫到你。
準(zhǔn)備篇
讀者需要至少掌握一門面向?qū)ο缶幊陶Z言,并了解該語言內(nèi)置的數(shù)據(jù)結(jié)構(gòu)。我會(huì)以java作為基礎(chǔ)教學(xué)語言,分析題目的思路。希望各位在學(xué)習(xí)的過程中能夠有所收獲,找到理想的工作。
學(xué)習(xí)篇
專欄重點(diǎn)
本專欄側(cè)重兩大板塊,一是“硬實(shí)力培養(yǎng)”,即跟著我一起學(xué)習(xí)和研究,我挑選出的最有價(jià)值的100道算法題,根據(jù)難度由淺入深地拆分成不同子專題,并分類講解:鏈表,二叉樹,圖,堆,棧,遞歸,動(dòng)態(tài)規(guī)劃,搜索,排序,數(shù)組,字符串……
二是“軟實(shí)力養(yǎng)成”,我會(huì)盡我所能,教你在面試過程中應(yīng)當(dāng)如何隨機(jī)應(yīng)變,又應(yīng)當(dāng)如何與面試官保持良好的氣氛進(jìn)行有效溝通。正確而有效的溝通很重要,你的面試場(chǎng)景如果是面試官出一道題,然后你就埋頭寫題,低著頭沉默著渡過一個(gè)小時(shí),那么基本上離拒信也就不遠(yuǎn)了,即使是技術(shù)面試,核心依然在溝通上。舉個(gè)“栗子”,關(guān)于算法的復(fù)雜度問題,就需要具體問題具體分析。有的面試官會(huì)要求給出最優(yōu)解法,有的面試官會(huì)要求先給出可行解再盡可能優(yōu)化。各種情況皆有可能,所以一定要預(yù)先溝通清楚,明確面試官的要求。
綜上,在本專欄中,我們將基于各種算法真題,一起探討以下這些問題:
如何用幾個(gè)例子確保自己理解正確的輸入輸出;
面試時(shí),要不要寫test測(cè)試corner case;
如果遇上了原題,要不要和面試官交代;
題目有哪些暗含的假設(shè)、數(shù)據(jù)量是否大的超出內(nèi)存;
寫代碼前后怎么向面試官解釋自己的思路;
……
建議篇
希望大家根據(jù)課程安排,能真的有所收獲,而不會(huì)再有同學(xué)抱怨“我明明是前后端全棧開發(fā),安卓/iOS樣樣上手,為什么因?yàn)槲覜]有刷過算法題就掛掉面試?”。另外,也希望大家能理解和體會(huì)到,事實(shí)上,在Google、Amazon、騰訊、阿里這樣的大廠里,大多數(shù)崗位是不需要工程師承擔(dān)一個(gè)完整的項(xiàng)目開發(fā)的,更多的是在已有的系統(tǒng)上開發(fā)新的feature。隨著公司的業(yè)務(wù)規(guī)模成長(zhǎng),我們就會(huì)發(fā)現(xiàn),越是發(fā)展業(yè)務(wù)場(chǎng)景就細(xì)化、feature越碎片化、工程師越螺絲釘化。大公司需要的工程師是能夠?qū)懗鼍_、高效的功能代碼,而不是所謂“精通前后端”。這樣看來,給出一個(gè)明確的小任務(wù),使用一段不超過兩百行的函數(shù)來解決問題、并進(jìn)行優(yōu)化,其實(shí)才是面試開發(fā)崗最正常的流程。
心態(tài)調(diào)整篇
有的時(shí)候你可能自信滿滿,而面試結(jié)果卻和心理預(yù)期背道而馳。這樣的事情幾乎每天都會(huì)發(fā)生。以大多數(shù)人的水平而言,過面試其實(shí)全靠面試官給面子。所以最重要的是,千萬別給面試官掛你的機(jī)會(huì),尤其不要在面試過程中與面試官對(duì)著干,比如質(zhì)疑或者否認(rèn)面試官的邏輯。一個(gè)好的辦法是多和同學(xué)、同事交流,大家相互mock面試場(chǎng)景。這樣既可鍛煉自己的臨場(chǎng)水平,也能借助旁觀者發(fā)現(xiàn)自己的不足。
調(diào)整好心態(tài),應(yīng)對(duì)每一次挑戰(zhàn)吧!
由衷的希望,本課程真的能為屏幕前的你帶來價(jià)值,在你向上先前的路上助你一臂之力。現(xiàn)在,就讓我們共同走進(jìn)這100道精選算法題,開啟你的成功路吧!