鏈接:https://www.nowcoder.com/discuss/21022?type=2&order=0&pos=1&page=1
以下文章是我去年拿到 Offer 以后的總結(jié),最近可能是春招開始了,我發(fā)現(xiàn)文章的閱讀數(shù)量又大幅度提高,所以復(fù)制過(guò)來(lái)希望幫助到有需要的同學(xué)。?
我的博客:bestswifter
簡(jiǎn)書原文:讓 BAT 的 Offer 不再難拿
我的微博:bestswifter
歡迎求職中的小伙伴加入 Q 群討論,有 BAT 的老司機(jī)帶:605586927?
作為一名 iOS 開發(fā)者,我所理解的基礎(chǔ)是 操作系統(tǒng)、網(wǎng)絡(luò)和算法這三大塊,
關(guān)于簡(jiǎn)歷的書寫,推薦兩篇文章:如何寫面向互聯(lián)網(wǎng)公司的求職簡(jiǎn)歷、程序猿簡(jiǎn)歷模板。你也可以參考我的簡(jiǎn)歷,沒有亮點(diǎn),就當(dāng)是拋磚引玉。?
百度?
一面:約 1.5 小時(shí)?
首先是四個(gè)算法題:?
不用臨時(shí)變量怎么實(shí)現(xiàn) swap(a, b)——用加法或者異或都可以
二維有序數(shù)組查找數(shù)字——?jiǎng)χ?offer 第 3題
億級(jí)日志中,查找登陸次數(shù)最多的十個(gè)用戶——(不確定對(duì)不對(duì),我的思路是)先用哈希表保存登陸次數(shù)和ID,然后用紅黑樹保存最大的十個(gè)數(shù)。劍指 offer 第 30題
簡(jiǎn)述排序算法——快排,partion函數(shù)的原理,堆排(不穩(wěn)定),歸并排序,基數(shù)排序。
然后有一個(gè),沒完整的答出來(lái),好像影響不是很大。?
最后是 iOS 相關(guān),面試官問(wèn)的很開放,都是談?wù)勛约旱睦斫猓?
說(shuō)說(shuō)你對(duì) OC 中l(wèi)oad方法和initialize方法的異同?!饕f(shuō)一下執(zhí)行時(shí)間,各自用途,沒實(shí)現(xiàn)子類的方法會(huì)不會(huì)調(diào)用父類的?
說(shuō)說(shuō)你對(duì) block 的理解?!?三種 block,棧上的自動(dòng)復(fù)制到堆上,block 的屬性修飾符是 copy,循環(huán)引用的原理和解決方案。
說(shuō)說(shuō)你對(duì) runtime 的理解?!饕欠椒ㄕ{(diào)用時(shí)如何查找緩存,如何找到方法,找不到方法時(shí)怎么轉(zhuǎn)發(fā),對(duì)象的內(nèi)存布局。
說(shuō)說(shuō)你對(duì) MVC 和 MVVM 的理解?!?MVC 的 C 太臃腫,可以和 V 合并,變成 MVVM 中的 V,而 VM 用來(lái)將 M 轉(zhuǎn)化成 V 能用的數(shù)據(jù)。
說(shuō)說(shuō) UITableView 的調(diào)優(yōu)?!环矫媸峭ㄟ^(guò) instruments 檢查影響性能的地方,另一方面是估算高度并在 runloop 空閑時(shí)緩存。
談?wù)勀銓?duì) ARC 的理解。ARC 是編譯器完成的,依靠引用計(jì)數(shù),談?wù)剮讉€(gè)屬性修飾符的內(nèi)存管理策略,什么情況下會(huì)內(nèi)存泄露。
一面的問(wèn)題非?;A(chǔ),主要是算法和 Objective-C,因?yàn)闇?zhǔn)備比較充分,基本上答出來(lái) 80% 吧。大約一周后突然二面。?
二面:約 0.5 小時(shí)?
二面比較突然,顯示簡(jiǎn)單的自我介紹,然后問(wèn)了三個(gè)問(wèn)題:?
野指針是什么,iOS 開發(fā)中什么情況下會(huì)有野指針?——野指針是不為 nil,但是指向已經(jīng)被釋放的內(nèi)存的指針,不知道什么時(shí)候會(huì)有,如果有知道的讀者還望提醒。
介紹 block。—— (接第一問(wèn)) 我讓面試官提示我一下什么時(shí)候會(huì)有野指針,他說(shuō)用 block 時(shí),我表示還是不知道,只知道 block 會(huì)有循環(huán)引用。于是就扯回了一面的問(wèn)題。
說(shuō)說(shuō)你是怎么優(yōu)化 UITableView 的?!€是一面的問(wèn)題。。。。。。。。。。。
雖然通過(guò)了,但是幾乎又問(wèn)了一遍一面的問(wèn)題讓我感覺對(duì)方不太認(rèn)真。?
三面:北京 onsite,約 2.5 小時(shí)?
首先是給一個(gè)小時(shí),手寫算法:?
首先是給一個(gè)小時(shí),手寫算法兩個(gè)算法題。接下來(lái)問(wèn)了 TCP 握手相關(guān)的。最后問(wèn)了 OC 的一些細(xì)節(jié)問(wèn)題。?
網(wǎng)易?
筆試?
主要是計(jì)算機(jī)方面的大雜燴,涉及操作系統(tǒng),網(wǎng)絡(luò),移動(dòng)開發(fā),算法等。難度不大,目測(cè)是為了淘汰渾水摸魚的人,就不列出題目了,算法有三題,直接在線寫(木有 IDE 表示很憂傷):?
很長(zhǎng)一道題,讀了很久才讀懂,目測(cè)是 DFS,但是最后沒時(shí)間了,寫了個(gè)思路。
把 "www.zhidao.baidu.com" 這樣的字符串改成 "com/baidu/zhidao/www"。——老題目了,劍指 offer 的,兩次逆序排列即可。
求數(shù)組中和為某個(gè)值的所有子數(shù)組,比如數(shù)組是[5,5,10,2,3]一共有四個(gè)子數(shù)組的和是 15,比如[5,10],[5,10],[10,2,3],[5,5,2,3]。這個(gè)就是簡(jiǎn)單的遞歸了,分兩種情況,當(dāng)前位置的數(shù)字在子數(shù)組中,以及不在子數(shù)組中。
一面?
全部是 iOS 題,可能是覺得算法已經(jīng)面過(guò)了:?
介紹 block?!姨岬綏I系?block 在 ARC 下會(huì)自動(dòng)復(fù)制到堆上,面試官問(wèn)我從 iOS 4 還是 5 開始支持這一特性,表示不知道,我又不是學(xué) OC 歷史的,后來(lái)想想可能是公司內(nèi)部老項(xiàng)目有這個(gè)坑。
ARC 會(huì)對(duì)代碼做什么優(yōu)化?——比如NSString *s2 = s1; s2 = nil這樣的語(yǔ)句,可能就不會(huì)有retain和release方法了。
介紹一下 MVVM 和 RAC?!赡苁俏液?jiǎn)歷的某個(gè)角落寫了用過(guò) RAC,被挖出來(lái)了,大概談了一下,結(jié)果面試官問(wèn)我數(shù)據(jù)的雙向綁定怎么做,bind函數(shù)了解過(guò)么,果斷說(shuō)已經(jīng)忘了??????
介紹自己用過(guò)哪些開源庫(kù)?!狹asonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage
如果讓你寫,你能實(shí)現(xiàn)么?——當(dāng)然不能,不然還要實(shí)習(xí)?
讀過(guò)某個(gè)庫(kù)的源碼么?——扯了一點(diǎn) SDWebImage,后來(lái)被告知這個(gè)庫(kù)用了 runloop 來(lái)保證滑動(dòng)是加載數(shù)據(jù)的流暢性,自己看了源碼后表示沒有發(fā)現(xiàn),唯一用到 runloop 地方是保證后臺(tái)線程一直跑,也有可能是我理解錯(cuò)了,如果錯(cuò)誤歡迎指正。
SDWebImage 下載了圖片后為什么要解碼?——當(dāng)時(shí)蒙住了,面試官很 nice 的解釋了一下,說(shuō)是要把 png 文件建立一個(gè)什么內(nèi)存映射,目前還不太懂,有空研究一下。
本來(lái)以為面的這么差肯定是掛了,沒想到還是過(guò)了一面。過(guò)了不到一個(gè)小時(shí),HR 電話打過(guò)來(lái),約了兩天后二面。?
二面?
純數(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就是指向下一個(gè)元素的指針,所以星號(hào)求值以后是 2。&a相當(dāng)于是數(shù)組的指針,&a + 1是數(shù)組后面一個(gè)數(shù)組的指針,然后轉(zhuǎn)換成int *類型是 5 這個(gè)數(shù)字后面的一個(gè)數(shù)字的指針。再減一就是指向 5 的指針,所以星號(hào)求值以后是 5。?
某個(gè)地方天氣有如下規(guī)律:如果第一天和第二天都不下雨,則第三天下雨的概率為30%;如果第一天和第二天中有任 意一天下雨,則第三天下雨的概率為60%。問(wèn)如果周一周二都沒下雨,那么周四下雨的概率為_。?
簡(jiǎn)單的概率題,答案是:30% * 60% + 70% * 30% = 39%?
某癡迷撲克的小團(tuán)體喜歡用23456789TJQKA來(lái)計(jì)數(shù),A后面是22,23,...,2A,32,...,AA,222,... 依次類推。 請(qǐng)用C/C++或Java寫個(gè)程序,將用字符串表示這種計(jì)數(shù)法轉(zhuǎn)換成字符串表示的10進(jìn)制整數(shù)。其中,該計(jì)數(shù)法的2就對(duì)應(yīng)于十進(jìn)制的2,之后依次遞增。C/C++函數(shù)接口: charpokToDec(char?)?
我的解決思路是進(jìn)制轉(zhuǎn)換,類似于 16 進(jìn)制轉(zhuǎn)換 10 進(jìn)制這種,最后再把數(shù)字轉(zhuǎn)成char *類型。?
然后好像沒結(jié)果了,可能是編程實(shí)現(xiàn)太渣了??
其他我知道的面試題?
阿里一面:?
MVC具有什么樣的優(yōu)勢(shì),各個(gè)模塊之間怎么通信,比如點(diǎn)擊 Button 后 怎么通知 Model?
兩個(gè)無(wú)限長(zhǎng)度鏈表(也就是可能有環(huán)) 判斷有沒有交點(diǎn)
UITableView的相關(guān)優(yōu)化
KVO、Notification、delegate各自的優(yōu)缺點(diǎn),效率還有使用場(chǎng)景
如何手動(dòng)通知KVO
Objective-C 中的copy方法
runtime 中,SEL和IMP的區(qū)別
autoreleasepool的使用場(chǎng)景和原理
RunLoop的實(shí)現(xiàn)原理和數(shù)據(jù)結(jié)構(gòu),什么時(shí)候會(huì)用到
block為什么會(huì)有循環(huán)引用
使用GCD如何實(shí)現(xiàn)這個(gè)需求:A、B、C 三個(gè)任務(wù)并發(fā),完成后執(zhí)行任務(wù) D。
NSOperation和GCD的區(qū)別
CoreData的使用,如何處理多線程問(wèn)題
如何設(shè)計(jì)圖片緩存?
有沒有自己設(shè)計(jì)過(guò)網(wǎng)絡(luò)控件?
阿里二面:?
怎么判斷某個(gè)cell是否顯示在屏幕上
進(jìn)程和線程的區(qū)別
TCP與UDP區(qū)別
TCP流量控制
數(shù)組和鏈表的區(qū)別
UIView生命周期
如果頁(yè)面 A 跳轉(zhuǎn)到 頁(yè)面 B,A 的viewDidDisappear方法和 B 的viewDidAppear方法哪個(gè)先調(diào)用?
block循環(huán)引用問(wèn)題
ARC的本質(zhì)
RunLoop的基本概念,它是怎么休眠的?
Autoreleasepool什么時(shí)候釋放,在什么場(chǎng)景下使用?
如何找到字符串中第一個(gè)不重復(fù)的字符
哈希表如何處理沖突
面試收獲?
1. 算法題怎么答?
面試官可能會(huì)問(wèn)到你聞所未聞的算法,這時(shí)候你不應(yīng)該自己瞎想,而是先和面試官把問(wèn)題討論清楚。要知道,通過(guò)溝通弄明白復(fù)雜的問(wèn)題也是一種能力,在和面試官交流的過(guò)程中,不僅僅可以搞清楚題目真正的意思是什么,還可以展現(xiàn)自己良好的交流溝通能力。所以千萬(wàn)不要因?yàn)榫o張或者害羞而浪費(fèi)這次大好的機(jī)會(huì)。?
有些題目似曾相識(shí),但是暫時(shí)沒有思路。這時(shí)候不妨告訴面試官,給我一些時(shí)間思考這個(gè)題。然后不要急,不要慌,就當(dāng)他不存在,拿出紙和筆慢慢算(這充分說(shuō)明了面試戴耳機(jī)的重要性)。你一定要堅(jiān)定一個(gè)信念:“任何一道稍微有難度的算法題,除非做過(guò),否則一定是需要時(shí)間想的”。所以,合理的安排思考時(shí)間吧。如果十幾分鐘都想不出來(lái),可以直接放棄。?
有時(shí)候面試官會(huì)要求在線編程,相信我,他不會(huì)無(wú)聊到盯著你的代碼看的,面試官一般都很忙,他也有自己的工作要完成,所以你就當(dāng)是用自己的 IDE 就好。在線編程往往是一個(gè)中等難度的問(wèn)題,所以不要自己嚇唬自己。同時(shí)要注意代碼格式的規(guī)范,適當(dāng)?shù)淖⑨?,提前編寫好測(cè)試用例等,即使沒有解決問(wèn)題,也至少要把自己良好的編程習(xí)慣展示給面試官。?
2. 遇到不會(huì)的問(wèn)題怎么處理?
這個(gè)問(wèn)題有可能是面試官故意說(shuō)得含糊不清,考察你的交流能力,也有可能是無(wú)意的,或者是你的理解方式出現(xiàn)了偏差。不管是以上哪種問(wèn)題,你都應(yīng)該先和面試官交流,直到你搞懂了面試官要問(wèn)你什么,而不是按照自己的理解說(shuō)了一堆無(wú)用的東西。?
舉個(gè)例子,面試官可能會(huì)問(wèn)了一道算法題:“如何判斷兩個(gè)無(wú)限長(zhǎng)度的鏈表是否有交點(diǎn)?”。對(duì)于“無(wú)限長(zhǎng)度”可以有不同的理解,如果真的是有無(wú)窮多個(gè)節(jié)點(diǎn),那顯然這個(gè)問(wèn)題是無(wú)法解決的。但如果鏈表僅僅是有環(huán),那么還是可以解決的。如果面試官的本意是鏈表有環(huán),但你錯(cuò)誤的理解成了無(wú)窮多個(gè)節(jié)點(diǎn),那么必然會(huì)導(dǎo)致無(wú)法回答這個(gè)問(wèn)題。而且這并非能力不足,而是屬于交流溝通方面的失誤,這也正是我想分享的“技巧”。?
還有一些問(wèn)題,雖然你沒有接觸過(guò),但是由于對(duì)類似的問(wèn)題或者情況有過(guò)思考,所以可以合理假設(shè)。比如面試官問(wèn) “ARC 會(huì)對(duì)代碼做什么樣的優(yōu)化?”。我們知道 ARC 的本質(zhì)就是在合適的地方插入retain和release等方法,那么就應(yīng)該從這個(gè)角度出發(fā)去思考問(wèn)題。?
顯然分別執(zhí)行retain和release操作是沒有必要的,那么就可以構(gòu)造出相應(yīng)的例子:?
NSString *s1 = @"hello";
NSString *s2 = s1;
NSString *s2 = nil;
由于這種問(wèn)題我們沒有真正實(shí)踐過(guò),所以可以委婉的告訴面試官:“根據(jù)我的推理,可能會(huì)有……”。?
3. 遇到真的不會(huì)的問(wèn)題怎么處理?
遇到不會(huì)的問(wèn)題果斷承認(rèn)啊。如果是基本問(wèn)題,比如問(wèn)你哈希表怎么實(shí)現(xiàn),你說(shuō)不會(huì),那么這次面試可能就懸了。如果是有一定難度的問(wèn)題,那么你承認(rèn)不會(huì),也是一種明智之舉,畢竟人無(wú)完人,一個(gè)問(wèn)題不會(huì)并不能全盤否定一個(gè)人的能力。?
但是比較糟糕的一種情況是,面試者由于過(guò)分緊張,擔(dān)心答不上面試官的問(wèn)題會(huì)有嚴(yán)重后果,所以嘗試著去敷衍面試官。比如:“我猜是 xxx 吧”,“我覺得可能是 ……”,更有甚者直接裝逼:“這個(gè)我試過(guò),不就是 xxx 么”。要知道,此時(shí)的你,由于緊張,在心態(tài)上已經(jīng)輸給了面試官,更何況面試官問(wèn)你的問(wèn)題一定是他有把握的,你覺得這時(shí)候你負(fù)隅頑抗會(huì)有幾成勝算呢??
所以,面試官問(wèn)我“堆排序”的細(xì)節(jié)時(shí),由于我當(dāng)時(shí)忘了堆排序是怎么實(shí)現(xiàn)的,所以我直接告訴他我記不清了。另一個(gè)主動(dòng)認(rèn)輸?shù)睦邮敲嬖嚬賳?wèn)我 RAC 如何實(shí)現(xiàn)雙向綁定,我告訴他這個(gè)是我當(dāng)時(shí)學(xué)習(xí)的時(shí)候?qū)戇^(guò)的 demo,因?yàn)椴怀S?,已?jīng)只記得一些簡(jiǎn)單的概念了。?
最后,還需要保持一個(gè)平穩(wěn)的心態(tài):“面試時(shí)盡力就好,遇到自己不會(huì)的問(wèn)題也是正常情況”。如果面試者順利答對(duì)了所有問(wèn)題,難免會(huì)讓面試官感到一絲尷尬,面試者也有可能會(huì)產(chǎn)生一些別的情緒。所以,我們要做的只是把自己的能力展示給面試官,做到不驕不躁。?
4. 準(zhǔn)備殺手锏?
除了能夠回答上面試官的問(wèn)題以外,我建議自己準(zhǔn)備一兩個(gè)殺手锏級(jí)別的話題。所謂的殺手锏,至少具備以下幾個(gè)特征:?
你親自動(dòng)手試驗(yàn)過(guò)。所謂實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),數(shù)據(jù)是不會(huì)說(shuō)謊的。
問(wèn)題有足夠的深度。一面的面試官可能是你的直接上司,二面一般就是更改級(jí)別的。你的深度一定要遠(yuǎn)超其他面試者,讓一面面試官覺得自己沒有十足把握,讓二面面試官覺得這是一個(gè)好話題,自己的手下都不一定能有這么獨(dú)到深刻的見解。
你對(duì)這個(gè)問(wèn)題理解的足夠深入,無(wú)論是廣度還是深度都達(dá)到一定水平。
以 iOS 中的UITableView的調(diào)優(yōu)為例,我自認(rèn)為對(duì)它有一定的理解,同為 iOS 開發(fā)者的讀者可以閱讀這篇文章:UIKit性能調(diào)優(yōu)實(shí)戰(zhàn)講解,同時(shí)我還仔細(xì)研究了 sunnyxx 大神的?優(yōu)化UITableViewCell高度計(jì)算的那些事。?
這一類的話題通常需要仔細(xì)研究官方文檔,iOS 開發(fā)者還可以觀看 WWDC 視頻,然后花上充足的時(shí)間去總結(jié)。比如我寫?iOS自定義轉(zhuǎn)場(chǎng)動(dòng)畫實(shí)戰(zhàn)講解這篇文章就花了至少三天時(shí)間,包括大年初一一整天。?
由于此類話題數(shù)量不多,所以準(zhǔn)備一個(gè)或數(shù)個(gè)即可,面試時(shí)可以有意識(shí)的將面試官引導(dǎo)到這些話題上去,從而充分的展示自己。?
5. 心態(tài)?
通常情況下,面試結(jié)果都會(huì)在 1 - 3 天內(nèi)知道。有的面試官會(huì)當(dāng)場(chǎng)告訴你通過(guò)了,有的公司面試結(jié)束后幾個(gè)小時(shí)就能出結(jié)果。?
但有些時(shí)候,由于某些原因(我也不清楚。。。。可能是比較忙?),你遲遲無(wú)法獲知面試結(jié)果。這時(shí)候你可以選擇耐心等待,獲知直接給 HR or 內(nèi)推者發(fā)送郵件。一般來(lái)說(shuō)面試結(jié)束后三天還沒收到通知,你可以發(fā)送郵件詢問(wèn)或者再等等。?
復(fù)習(xí)資料?
對(duì)于讀到這一段的讀者,為了感謝你耐心的聽我廢話了這么久,送上一波精心整理的干貨和資料。不敢說(shuō)完全沒有錯(cuò),但是應(yīng)該比自己去查要靠譜得多。主要涉及算法、網(wǎng)絡(luò)、操作系統(tǒng)、Objective-C 和 iOS 五個(gè)方面。如果你不是 iOS 開發(fā)者,相信前三部分的資料也或多或少能夠幫上你。?
算法?
這一部分的內(nèi)容主要分為以下幾個(gè)部分:字符串、數(shù)組與查找、鏈表、樹以及其他基礎(chǔ)問(wèn)題。?
總的來(lái)說(shuō),算法問(wèn)題可以分為以下三類:?
基礎(chǔ)問(wèn)題:即使是新手,一眼看過(guò)去就有思路,只是實(shí)現(xiàn)的時(shí)候需要注意細(xì)節(jié)。
普通問(wèn)題:這些問(wèn)題通常屬于以上分類中的某一類,需要面試者掌握一些常見的思路,比如遞歸、動(dòng)態(tài)規(guī)劃、BFS/DFS、雙指針、二分搜索 等?;蛘呤侵苯涌疾鞌?shù)據(jù)結(jié)構(gòu)的使用,如:哈希、棧和隊(duì)列、鏈表等,如果具備了這些基礎(chǔ)知識(shí),此類題目通常能夠比較快速的解決。
進(jìn)階問(wèn)題:這些題的解題思路和普通問(wèn)題相似,但是需要你事先有對(duì)應(yīng)的知識(shí)積累,否則難以直接看出問(wèn)題的本質(zhì)。
疑難雜題:這類問(wèn)題比較奇怪,解決它以后并不能給別的題目太多幫助,如果時(shí)間緊張可以暫時(shí)放棄。
一般來(lái)說(shuō),一類問(wèn)題難度不大,面試前簡(jiǎn)單復(fù)習(xí)一下,面試時(shí)小心仔細(xì),全面思考即可。二三類問(wèn)題是面試重點(diǎn),需要提前準(zhǔn)備。第四類問(wèn)題通常出現(xiàn)較少,即使不會(huì)做,對(duì)最終評(píng)價(jià)的負(fù)面影響也不會(huì)有前三類那么大。?
如果時(shí)間充裕,我建議閱讀《劍指 Offer》這本書并配合?Leetcode來(lái)鞏固知識(shí),在我的面試過(guò)程中,出現(xiàn)很多書上的原題或者變體,我自認(rèn)為沒有因?yàn)樗惴ǘ绊懭魏我淮蚊嬖嚨某煽?jī)。如果時(shí)間緊張,你也可以只完成我列出的一些經(jīng)典題目,在“【】”中標(biāo)記了我對(duì)此題類型的分類,如果加星號(hào)表示此題在實(shí)際面試中出現(xiàn)過(guò)。?
PS: 最近有小伙伴被問(wèn)到了哈希表的實(shí)現(xiàn)。這可以理解為算法,也可以歸類為計(jì)算機(jī)基礎(chǔ)知識(shí)??偟膩?lái)說(shuō)你至少需要明白哈希值的特點(diǎn)和兩種解決沖突的方式:拉鏈?zhǔn)胶烷_放尋址。?
字符串
【4】KMP 算法
動(dòng)態(tài)規(guī)劃
【4】實(shí)現(xiàn)簡(jiǎn)單的正則表達(dá)式匹配
數(shù)組
【3】求兩個(gè)等長(zhǎng)、有序數(shù)組的中位數(shù)(二分法)
【4】求兩個(gè)不等長(zhǎng)、有序數(shù)組的中位數(shù)
【3】旋轉(zhuǎn)數(shù)組求最小值、【3】旋轉(zhuǎn)數(shù)組求查找某個(gè)值是否存在(二分法)
【4*】每行從左到右,每列從上到下遞增的二維數(shù)組中,判斷某個(gè)數(shù)是否存在(劍指 offer 第 3 題)
【3*】數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的數(shù)字
【3*】第 k 大的數(shù)(拓展:最大的 k 個(gè)數(shù))
【3*】有序數(shù)組中某個(gè)數(shù)字出現(xiàn)的次數(shù)(提示:利用二分搜索)
鏈表
【2】反轉(zhuǎn)鏈表(使用遞歸和迭代兩種解法,了解頭插法)
【3】刪除倒數(shù)第 k 個(gè)節(jié)點(diǎn)
【3*】?jī)蓚€(gè)鏈表的第一個(gè)公共節(jié)點(diǎn)(提示:考慮鏈表有環(huán)的情況)
樹
【3】根據(jù)中序和后序遍歷結(jié)果重建二叉樹、【3】根據(jù)中序和前序遍歷結(jié)果重建二叉樹
【2】從上往下打印二叉樹(BFS 的思想)
【3】判斷某個(gè)數(shù)組是不是二叉樹的后序遍歷結(jié)果 (劍指 offer 第 24 題)
【3*】二叉樹中某個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn) (強(qiáng)烈推薦準(zhǔn)備一下,劍指 offer 第 58 題)
棧
【2】用兩個(gè)棧實(shí)現(xiàn)隊(duì)列、【2】用兩個(gè)隊(duì)列實(shí)現(xiàn)棧
【2】實(shí)現(xiàn)一個(gè)棧,可以用常數(shù)級(jí)時(shí)間找出棧中的最小值
【3】判斷棧的壓棧、彈棧序列是否合法(劍指offer 第 22 題)
排序
了解以下排序的時(shí)間、空間復(fù)雜度,是否穩(wěn)定,實(shí)現(xiàn)原理?
歸并排序、拓展:求數(shù)組中的逆序?qū)€(gè)數(shù)
快速排序重點(diǎn):partion函數(shù)的實(shí)現(xiàn)
數(shù)組元素值域已知時(shí),考慮?基數(shù)排序和?桶排序
位運(yùn)算
【2】給一個(gè)十進(jìn)制數(shù)字,求它的二進(jìn)制表示中,有多少個(gè) 1(n &= n - 1)
【3】給一個(gè)數(shù)組,所有數(shù)字都出現(xiàn)了偶數(shù)次,只有一個(gè)出現(xiàn)了一次,找出這個(gè)數(shù)
【4】給一個(gè)數(shù)組,所有數(shù)字都出現(xiàn)了三次,只有一個(gè)出現(xiàn)了一次,找出這個(gè)數(shù)
【3】給一個(gè)數(shù)組,所有數(shù)組都出現(xiàn)了偶數(shù)次,只有兩個(gè)數(shù)字出現(xiàn)了一次,找出這兩個(gè)數(shù)
網(wǎng)絡(luò)層?
根據(jù)不同的面試崗位,側(cè)重點(diǎn)略有不同。對(duì) iOS 和 Android 開發(fā)者來(lái)說(shuō),HTTP 考的略少,以 TCP 和 UDP 為主。其實(shí) UDP 基本上只會(huì)考察和 TCP 的區(qū)別。?
當(dāng)然還有一些常見的基礎(chǔ)問(wèn)題,比如 Cookie 和 Session 的考察,POST 和 GET 的考察,HTTPS 的簡(jiǎn)單了解等。這些問(wèn)題在我的博客中都有簡(jiǎn)單的總結(jié)。?
總結(jié)了一些資料,數(shù)字序號(hào)越大的資料表示篇幅更長(zhǎng),耗時(shí)更久,難度更大,講解更細(xì)致。破折線后表示預(yù)計(jì)需要多久可以讀完。?
【博客】我的六篇總結(jié)————不到一周
【書】圖解 TCP/IP————半個(gè)月
【書】TCP/IP 詳解————沒讀過(guò),感覺至少需要一個(gè)月
【書】TCP/IP 協(xié)議簇————沒讀過(guò),感覺至少需要一個(gè)月
光讀書是沒有用的,一問(wèn)到實(shí)際問(wèn)題很容易懵逼,以下是我總結(jié)的一些問(wèn)題:?
簡(jiǎn)介 TCP 和 UDP 區(qū)別,他們位于哪一層?
路由器和交換機(jī)的工作原理大概是什么,他們分別用到什么協(xié)議,位于哪一層?
描述TCP 協(xié)議三次握手,四次釋放的過(guò)程。
TCP 協(xié)議是如何進(jìn)行流量控制,擁塞控制的?
為什么建立連接時(shí)是三次握手,兩次行不行?如果第三次握手失敗了怎么處理
關(guān)閉連接時(shí),第四次握手失敗怎么處理?
你怎么理解分層和協(xié)議?
HTTP 請(qǐng)求中的?GET 和 POST 的區(qū)別),Session 和 Cookie 的區(qū)別。
談?wù)勀銓?duì) HTTP 1.1,2.0 和 HTTPS 的理解。
操作系統(tǒng)與編譯?
我被問(wèn)到的操作系統(tǒng)問(wèn)題很少,所以僅僅總結(jié)了一些自認(rèn)為比較重要的問(wèn)題。關(guān)于這一部分的知識(shí),推薦閱讀《程序員的自我修養(yǎng)》,如果時(shí)間有限,你可以閱讀我的《程序員的自我修養(yǎng)讀書筆記》,并思考這些問(wèn)題:?
源代碼是怎么變成可執(zhí)行文件的,每一步的作用是什么?(預(yù)編譯,詞法分析,語(yǔ)法分析,語(yǔ)義分析,中間語(yǔ)言生成目標(biāo)代碼生成,匯編,鏈接)
應(yīng)用層、API、運(yùn)行庫(kù)、系統(tǒng)調(diào)用、操作系統(tǒng)內(nèi)核之間的關(guān)系是什么?
虛擬內(nèi)存空間是什么,為什么要有虛擬內(nèi)存空間。
靜態(tài)鏈接和動(dòng)態(tài)鏈接分別表示什么,大概是怎么實(shí)現(xiàn)的?
可執(zhí)行文件的結(jié)構(gòu)如何?(分為哪些段)
它是怎么裝載進(jìn)內(nèi)存的,為什么要分段,分頁(yè),頁(yè)錯(cuò)誤是什么?
進(jìn)程的內(nèi)存格局是怎樣的?(堆、棧、全局/靜態(tài)區(qū),代碼區(qū),常量區(qū))
堆和棧的區(qū)別,函數(shù)調(diào)用和棧的關(guān)系
進(jìn)程和線程的區(qū)別
異步和同步,串行,并發(fā),并行的區(qū)別
多并發(fā)任務(wù),僅多線程能加快速度么(不能,會(huì)變慢,有線程切換的開銷)
多個(gè)線程之間可以共享那些數(shù)據(jù)
進(jìn)程之間如何通信
介紹幾種鎖,他們的用途和區(qū)別
關(guān)于多線程相關(guān)的,推薦閱讀這篇文章的前面一小部分——《iOS多線程編程——GCD與NSOperation總結(jié)》
關(guān)于操作系統(tǒng)和編譯方面的文章,除了讀原書和我的讀書筆記外,還可以參考這篇文章——《修改一個(gè)數(shù)字破解Mac上的應(yīng)用》
OC
首先兩本必備的神書一定是要讀完的。一本是講 OC 的《Effective Objective-C 2.0》,中文名叫:“編寫高質(zhì)量 iOS 與 OS X 代碼的 52 個(gè)有效方法”。另一本書叫:《Objective-C 高級(jí)編程》。前者講解 OC 中各種細(xì)節(jié),后者主要講了 ARC、Block 和 GCD。?
光是讀書,思考不夠,很容易在面試時(shí)被問(wèn)懵逼,所以建議一遍嘗試回答面試真題,一邊閱讀以下總結(jié)性的文章,重要性不分先后:?
KVO與KVC原理、KVO、Notification、Delegate優(yōu)缺點(diǎn)、最推薦的官方文檔
強(qiáng)烈推薦第八篇文章,做完這上面的題目基本上可以應(yīng)付大多數(shù) OC 方面的問(wèn)題了。
iOS 開發(fā)?
iOS 函數(shù)式編程的實(shí)現(xiàn) && 響應(yīng)式編程概念
UIKit 性能調(diào)優(yōu)(主要是UITableView)
優(yōu)化UITableViewCell高度計(jì)算的那些事
其中需要重點(diǎn)了解runloop,它不僅僅是簡(jiǎn)單的“跑圈”的 概念,很多問(wèn)題其實(shí)都與它有關(guān),建議認(rèn)真閱讀 ibireme 大神的總結(jié)
其他面經(jīng)?