隨著各大公司春招的開始,很多小伙伴都行動起來了,我有幸能夠加入百度并和大家分享自己的經(jīng)驗心得。由于我面試的都是比較大的公司,所以自然也是做了這方面的準(zhǔn)備,因此這篇總結(jié)并不一定適合想去創(chuàng)業(yè)公司的同學(xué)。另外,由于經(jīng)驗本來就是主觀性極強的東西,加之筆者水平有限,所以如果有不認(rèn)可的地方,萬望諸君呵呵一笑,拋之腦后。
接下來,我就斗膽分享一下自己在準(zhǔn)備和參加面試的過程中的收獲、對面試的思考,以及一些可能對大家有用的建議。最后附贈一份大禮包,希望能幫助每位讀者找到自己心儀的工作。
有些人可能會把面試看的太重,覺得面試過了就能進(jìn)入大廠,技術(shù)和財富兼得……
我倒是覺得,面試沒有這么夸張(抱歉做了一回標(biāo)題黨),它其實是一次你和面試官互相了解的絕佳機會,借此機會你還可以對未來的工作有初步的了解。
面試本身并不能完全評價一人個的實力。面試通過的人,也許只是恰好在面試時遇到了自己熟悉的問題,面試不通過,也有可能是面試官自身的問題,并非每個面試官都具備客觀評價別人的能力。
換句話說,面試沒通過也許是面試官沒有發(fā)現(xiàn)你的才華,面試通過了也并不代表你就能勝任工作,因為進(jìn)入企業(yè)之后可不是每天負(fù)責(zé)回答面試題!
所以從這一點來看,面試有點像相親。你滿意我,我滿意你,王八對綠豆——看上眼了,那就一拍即合,否則就分道揚鑣。我本人非常希望能夠多幾輪面試(實際并不總是能做到),這樣大家都有充足的時間互相了解,決定去留。
網(wǎng)上某些面經(jīng)中,介紹了一些“裝逼”的方法,還有所謂的“面試技巧”,我是不太認(rèn)可的。技巧需要有,這是為了讓你更好的展示自己,而非坑蒙拐騙,無理取鬧,無中生有。我更想展現(xiàn)一個真實的自己,如果面試官不認(rèn)可,說明我們沒有緣分,或者說自己的能力還不夠。
有一位小伙伴面試阿里被拒后,面試官給出了這樣的評價:“……計算機基礎(chǔ),以及編程基礎(chǔ)能力上都有所欠缺……”。但這種籠統(tǒng)的回答并非是我們希望的答案,所謂的基礎(chǔ)到底指的是什么?
作為一名 iOS 開發(fā)者,我所理解的基礎(chǔ)是 操作系統(tǒng)、網(wǎng)絡(luò)和算法這三大塊,不同的開發(fā)方向可能有不同的側(cè)重,但基礎(chǔ)總的來說就是這些。我不推薦通過去網(wǎng)上看教程來學(xué)習(xí)這些基礎(chǔ)知識,因為能用短短幾篇文章講明白的事情不叫基礎(chǔ),至少我沒見過寫得這么深入淺出的文章。
不知道有多少讀者和我一樣有過這樣的困擾:“我知道某些東西很重要,所以去百度查了資料,但是查到的文章質(zhì)量很差,正確率沒有保證”。這其實是正常的,優(yōu)秀的文章一般都放在優(yōu)秀的作者的個人博客上,這恰恰是搜索引擎的盲區(qū),所以一般只能搜到 CSDN、博客園這種地方的文章。自然就無法保證文章質(zhì)量。
出于這種考慮,我在文章最后的復(fù)習(xí)資料中,提供了用于學(xué)習(xí)相關(guān)基礎(chǔ)知識的書籍,如果您恰好是 iOS 開發(fā)者,還可以閱讀我收集的一些高質(zhì)量文章,正確性比較有保證(我寫的除外)。
除了準(zhǔn)備通用的基礎(chǔ)知識以外,簡歷也是一個很重要的環(huán)節(jié)。一直很仰慕唐巧老師的猿題庫,無奈簡歷太差,都沒有收到面試邀請。后來好好改了簡歷以后,就沒有這種問題了。關(guān)于簡歷的書寫,推薦兩篇文章:如何寫面向互聯(lián)網(wǎng)公司的求職簡歷、程序猿簡歷模板。你也可以參考我的簡歷,沒有亮點,就當(dāng)是拋磚引玉。
最后,當(dāng)然是準(zhǔn)備好相關(guān)崗位的基礎(chǔ)知識了。作為 iOS 開發(fā)者,雖然 Swift 已經(jīng)發(fā)布了快兩年,但是大公司轉(zhuǎn)向 Swift 的動作還不明顯,所以 Objective-C 幾乎是必備項,Swift 都不一定能算是加分項。iOS 方面的知識也必不可少,雖然招聘信息上寫著如果基礎(chǔ)扎實,零 iOS 基礎(chǔ)也可以,但是現(xiàn)實往往是比較殘酷的。
扯了這么多,終于進(jìn)入正題了,分享一下我的面試經(jīng)歷。題目如下,破折線后面是簡單的解決思路。
首先是四個算法題:
partion
函數(shù)的原理,堆排(不穩(wěn)定),歸并排序,基數(shù)排序。然后有一個智力題,沒完整的答出來,好像影響不是很大。
最后是 iOS 相關(guān),面試官問的很開放,都是談?wù)勛约旱睦斫猓?/p>
load
方法和 initialize
方法的異同?!饕f一下執(zhí)行時間,各自用途,沒實現(xiàn)子類的方法會不會調(diào)用父類的?一面的問題非?;A(chǔ),主要是算法和 Objective-C,因為準(zhǔn)備比較充分,基本上答出來 80% 吧。大約一周后突然二面。
二面比較突然,顯示簡單的自我介紹,然后問了三個問題:
雖然通過了,但是幾乎又問了一遍一面的問題讓我感覺對方不太認(rèn)真。
首先是給一個小時,手寫算法兩個算法題。接下來問了 TCP 握手相關(guān)的。最后問了 OC 的一些細(xì)節(jié)問題。
主要是計算機方面的大雜燴,涉及操作系統(tǒng),網(wǎng)絡(luò),移動開發(fā),算法等。難度不大,目測是為了淘汰渾水摸魚的人,就不列出題目了,算法有三題,直接在線寫(木有 IDE 表示很憂傷):
[5,5,10,2,3]
一共有四個子數(shù)組的和是 15,比如 [5,10]
,[5,10]
,[10,2,3]
,[5,5,2,3]
。這個就是簡單的遞歸了,分兩種情況,當(dāng)前位置的數(shù)字在子數(shù)組中,以及不在子數(shù)組中。全部是 iOS 題,可能是覺得算法已經(jīng)面過了:
NSString *s2 = s1; s2 = nil
這樣的語句,可能就不會有 retain
和 release
方法了。 bind
函數(shù)了解過么,果斷說已經(jīng)忘了??????本來以為面的這么差肯定是掛了,沒想到還是過了一面。過了不到一個小時,HR 電話打過來,約了兩天后二面。
純數(shù)學(xué)和算法:
下面這段代碼的輸出結(jié)果是:
int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a 1); printf(“%d,%d”,*(a 1),*(ptr-1)); }
答案是 2 和 5。a
是指向數(shù)組開頭元素的指針,a 1
就是指向下一個元素的指針,所以星號求值以后是 2。&a
相當(dāng)于是數(shù)組的指針,&a 1
是數(shù)組后面一個數(shù)組的指針,然后轉(zhuǎn)換成int *
類型是 5 這個數(shù)字后面的一個數(shù)字的指針。再減一就是指向 5 的指針,所以星號求值以后是 5。
某個地方天氣有如下規(guī)律:如果第一天和第二天都不下雨,則第三天下雨的概率為30%;如果第一天和第二天中有任 意一天下雨,則第三天下雨的概率為60%。問如果周一周二都沒下雨,那么周四下雨的概率為_。
簡單的概率題,答案是:30% * 60% 70% * 30% = 39%
某癡迷撲克的小團體喜歡用23456789TJQKA來計數(shù),A后面是22,23,...,2A,32,...,AA,222,... 依次類推。
請用C/C 或Java寫個程序,將用字符串表示這種計數(shù)法轉(zhuǎn)換成字符串表示的10進(jìn)制整數(shù)。其中,該計數(shù)法的2就對應(yīng)于十進(jìn)制的2,之后依次遞增。C/C 函數(shù)接口: char pokToDec(char )
我的解決思路是進(jìn)制轉(zhuǎn)換,類似于 16 進(jìn)制轉(zhuǎn)換 10 進(jìn)制這種,最后再把數(shù)字轉(zhuǎn)成 char *
類型。
然后好像沒結(jié)果了,可能是編程實現(xiàn)太渣了?
MVC
具有什么樣的優(yōu)勢,各個模塊之間怎么通信,比如點擊 Button 后 怎么通知 Model?UITableView
的相關(guān)優(yōu)化KVO
、Notification
、delegate
各自的優(yōu)缺點,效率還有使用場景KVO
copy
方法SEL
和 IMP
的區(qū)別autoreleasepool
的使用場景和原理RunLoop
的實現(xiàn)原理和數(shù)據(jù)結(jié)構(gòu),什么時候會用到block
為什么會有循環(huán)引用GCD
如何實現(xiàn)這個需求:A、B、C 三個任務(wù)并發(fā),完成后執(zhí)行任務(wù) D。NSOperation
和 GCD
的區(qū)別CoreData
的使用,如何處理多線程問題cell
是否顯示在屏幕上TCP
與 UDP
區(qū)別TCP
流量控制UIView
生命周期viewDidDisappear
方法和 B 的 viewDidAppear
方法哪個先調(diào)用?block
循環(huán)引用問題ARC
的本質(zhì)RunLoop
的基本概念,它是怎么休眠的?Autoreleasepool
什么時候釋放,在什么場景下使用?面試官可能會問到你聞所未聞的算法,這時候你不應(yīng)該自己瞎想,而是先和面試官把問題討論清楚。要知道,通過溝通弄明白復(fù)雜的問題也是一種能力,在和面試官交流的過程中,不僅僅可以搞清楚題目真正的意思是什么,還可以展現(xiàn)自己良好的交流溝通能力。所以千萬不要因為緊張或者害羞而浪費這次大好的機會。
有些題目似曾相識,但是暫時沒有思路。這時候不妨告訴面試官,給我一些時間思考這個題。然后不要急,不要慌,就當(dāng)他不存在,拿出紙和筆慢慢算(這充分說明了面試戴耳機的重要性)。你一定要堅定一個信念:“任何一道稍微有難度的算法題,除非做過,否則一定是需要時間想的”。所以,合理的安排思考時間吧。如果十幾分鐘都想不出來,可以直接放棄。
有時候面試官會要求在線編程,相信我,他不會無聊到盯著你的代碼看的,面試官一般都很忙,他也有自己的工作要完成,所以你就當(dāng)是用自己的 IDE 就好。在線編程往往是一個中等難度的問題,所以不要自己嚇唬自己。同時要注意代碼格式的規(guī)范,適當(dāng)?shù)淖⑨?,提前編寫好測試用例等,即使沒有解決問題,也至少要把自己良好的編程習(xí)慣展示給面試官。
這個問題有可能是面試官故意說得含糊不清,考察你的交流能力,也有可能是無意的,或者是你的理解方式出現(xiàn)了偏差。不管是以上哪種問題,你都應(yīng)該先和面試官交流,直到你搞懂了面試官要問你什么,而不是按照自己的理解說了一堆無用的東西。
舉個例子,面試官可能會問了一道算法題:“如何判斷兩個無限長度的鏈表是否有交點?”。對于“無限長度”可以有不同的理解,如果真的是有無窮多個節(jié)點,那顯然這個問題是無法解決的。但如果鏈表僅僅是有環(huán),那么還是可以解決的。如果面試官的本意是鏈表有環(huán),但你錯誤的理解成了無窮多個節(jié)點,那么必然會導(dǎo)致無法回答這個問題。而且這并非能力不足,而是屬于交流溝通方面的失誤,這也正是我想分享的“技巧”。
還有一些問題,雖然你沒有接觸過,但是由于對類似的問題或者情況有過思考,所以可以合理假設(shè)。比如面試官問 “ARC 會對代碼做什么樣的優(yōu)化?”。我們知道 ARC 的本質(zhì)就是在合適的地方插入 retain
和 release
等方法,那么就應(yīng)該從這個角度出發(fā)去思考問題。
顯然分別執(zhí)行 retain
和 release
操作是沒有必要的,那么就可以構(gòu)造出相應(yīng)的例子:
NSString *s1 = @'hello';NSString *s2 = s1;NSString *s2 = nil;
由于這種問題我們沒有真正實踐過,所以可以委婉的告訴面試官:“根據(jù)我的推理,可能會有……”。
遇到不會的問題果斷承認(rèn)啊。如果是基本問題,比如問你哈希表怎么實現(xiàn),你說不會,那么這次面試可能就懸了。如果是有一定難度的問題,那么你承認(rèn)不會,也是一種明智之舉,畢竟人無完人,一個問題不會并不能全盤否定一個人的能力。
但是比較糟糕的一種情況是,面試者由于過分緊張,擔(dān)心答不上面試官的問題會有嚴(yán)重后果,所以嘗試著去敷衍面試官。比如:“我猜是 xxx 吧”,“我覺得可能是 ……”,更有甚者直接裝逼:“這個我試過,不就是 xxx 么”。要知道,此時的你,由于緊張,在心態(tài)上已經(jīng)輸給了面試官,更何況面試官問你的問題一定是他有把握的,你覺得這時候你負(fù)隅頑抗會有幾成勝算呢?
所以,面試官問我“堆排序”的細(xì)節(jié)時,由于我當(dāng)時忘了堆排序是怎么實現(xiàn)的,所以我直接告訴他我記不清了。另一個主動認(rèn)輸?shù)睦邮敲嬖嚬賳栁?RAC 如何實現(xiàn)雙向綁定,我告訴他這個是我當(dāng)時學(xué)習(xí)的時候?qū)戇^的 demo,因為不常用,已經(jīng)只記得一些簡單的概念了。
最后,還需要保持一個平穩(wěn)的心態(tài):“面試時盡力就好,遇到自己不會的問題也是正常情況”。如果面試者順利答對了所有問題,難免會讓面試官感到一絲尷尬,面試者也有可能會產(chǎn)生一些別的情緒。所以,我們要做的只是把自己的能力展示給面試官,做到不驕不躁。
除了能夠回答上面試官的問題以外,我建議自己準(zhǔn)備一兩個殺手锏級別的話題。所謂的殺手锏,至少具備以下幾個特征:
以 iOS 中的 UITableView
的調(diào)優(yōu)為例,我自認(rèn)為對它有一定的理解,同為 iOS 開發(fā)者的讀者可以閱讀這篇文章:UIKit性能調(diào)優(yōu)實戰(zhàn)講解,同時我還仔細(xì)研究了 sunnyxx 大神的 優(yōu)化UITableViewCell高度計算的那些事。
這一類的話題通常需要仔細(xì)研究官方文檔,iOS 開發(fā)者還可以觀看 WWDC 視頻,然后花上充足的時間去總結(jié)。比如我寫 iOS自定義轉(zhuǎn)場動畫實戰(zhàn)講解 這篇文章就花了至少三天時間,包括大年初一一整天。
由于此類話題數(shù)量不多,所以準(zhǔn)備一個或數(shù)個即可,面試時可以有意識的將面試官引導(dǎo)到這些話題上去,從而充分的展示自己。
通常情況下,面試結(jié)果都會在 1 - 3 天內(nèi)知道。有的面試官會當(dāng)場告訴你通過了,有的公司面試結(jié)束后幾個小時就能出結(jié)果。
但有些時候,由于某些原因(我也不清楚。。。。可能是比較忙?),你遲遲無法獲知面試結(jié)果。這時候你可以選擇耐心等待,獲知直接給 HR or 內(nèi)推者發(fā)送郵件。一般來說面試結(jié)束后三天還沒收到通知,你可以發(fā)送郵件詢問或者再等等。
對于讀到這一段的讀者,為了感謝你耐心的聽我廢話了這么久,送上一波精心整理的干貨和資料。不敢說完全沒有錯,但是應(yīng)該比自己去查要靠譜得多。主要涉及算法、網(wǎng)絡(luò)、操作系統(tǒng)、Objective-C 和 iOS 五個方面。如果你不是 iOS 開發(fā)者,相信前三部分的資料也或多或少能夠幫上你。
這一部分的內(nèi)容主要分為以下幾個部分:字符串、數(shù)組與查找、鏈表、樹以及其他基礎(chǔ)問題。
總的來說,算法問題可以分為以下三類:
一般來說,一類問題難度不大,面試前簡單復(fù)習(xí)一下,面試時小心仔細(xì),全面思考即可。二三類問題是面試重點,需要提前準(zhǔn)備。第四類問題通常出現(xiàn)較少,即使不會做,對最終評價的負(fù)面影響也不會有前三類那么大。
如果時間充裕,我建議閱讀《劍指 Offer》這本書并配合 Leetcode 來鞏固知識,在我的面試過程中,出現(xiàn)很多書上的原題或者變體,我自認(rèn)為沒有因為算法而影響任何一次面試的成績。如果時間緊張,你也可以只完成我列出的一些經(jīng)典題目,在“【】”中標(biāo)記了我對此題類型的分類,如果加星號表示此題在實際面試中出現(xiàn)過。
PS: 最近有小伙伴被問到了哈希表的實現(xiàn)。這可以理解為算法,也可以歸類為計算機基礎(chǔ)知識??偟膩碚f你至少需要明白哈希值的特點和兩種解決沖突的方式:拉鏈?zhǔn)胶烷_放尋址。
聯(lián)系客服