隨著各大公司春招的開始冀惭,很多小伙伴都行動起來了,我有幸能夠加入百度并和大家分享自己的經(jīng)驗心得。由于我面試的都是比較大的公司可柿,所以自然也是做了這方面的準備,因此這篇總結(jié)并不一定適合想去創(chuàng)業(yè)公司的同學(xué)丙者。另外复斥,由于經(jīng)驗本來就是主觀性極強的東西,加之筆者水平有限械媒,所以如果有不認可的地方目锭,萬望諸君呵呵一笑评汰,拋之腦后。
接下來痢虹,我就斗膽分享一下自己在準備和參加面試的過程中的收獲被去、對面試的思考,以及一些可能對大家有用的建議奖唯。最后附贈一份大禮包惨缆,希望能幫助每位讀者找到自己心儀的工作。
什么是面試
有些人可能會把面試看的太重丰捷,覺得面試過了就能進入大廠坯墨,技術(shù)和財富兼得……
面試本身并不能完全評價一個人的實力。面試通過的人病往,也許只是恰好在面試時遇到了自己熟悉的問題捣染,面試不通過,也有可能是面試官自身的問題荣恐,并非每個面試官都具備客觀評價別人的能力液斜。
換句話說,面試沒通過也許是面試官沒有發(fā)現(xiàn)你的才華叠穆,面試通過了也并不代表你就能勝任工作少漆,因為進入企業(yè)之后可不是每天負責回答面試題!
所以從這一點來看硼被,面試有點像相親示损。你滿意我,我滿意你嚷硫,王八對綠豆——看上眼了检访,那就一拍即合,否則就分道揚鑣仔掸。我本人非常希望能夠多幾輪面試(實際并不總是能做到)脆贵,這樣大家都有充足的時間互相了解,決定去留起暮。
面試要準備什么
有一位小伙伴面試阿里被拒后卖氨,面試官給出了這樣的評價:“……計算機基礎(chǔ),以及編程基礎(chǔ)能力上都有所欠缺……”负懦。但這種籠統(tǒng)的回答并非是我們希望的答案筒捺,所謂的基礎(chǔ)到底指的是什么?
不知道有多少讀者和我一樣有過這樣的困擾:“我知道某些東西很重要纸厉,所以去百度查了資料系吭,但是查到的文章質(zhì)量很差,正確率沒有保證”颗品。這其實是正常的肯尺,優(yōu)秀的文章一般都放在優(yōu)秀的作者的個人博客上沃缘,這恰恰是搜索引擎的盲區(qū),所以一般只能搜到 CSDN蟆盹、博客園這種地方的文章孩灯。自然就無法保證文章質(zhì)量。
出于這種考慮逾滥,我在文章最后的復(fù)習(xí)資料中峰档,提供了用于學(xué)習(xí)相關(guān)基礎(chǔ)知識的書籍,如果您恰好是 iOS 開發(fā)者寨昙,還可以閱讀我收集的一些高質(zhì)量文章讥巡,正確性比較有保證(我寫的除外)。
除了準備通用的基礎(chǔ)知識以外舔哪,簡歷也是一個很重要的環(huán)節(jié)欢顷。一直很仰慕唐巧老師的猿題庫,無奈簡歷太差捉蚤,都沒有收到面試邀請抬驴。后來好好改了簡歷以后,就沒有這種問題了缆巧。關(guān)于簡歷的書寫布持,推薦兩篇文章:如何寫面向互聯(lián)網(wǎng)公司的求職簡歷、程序猿簡歷模板陕悬。你也可以參考我的簡歷题暖,沒有亮點,就當是拋磚引玉捉超。
我的面試經(jīng)歷
扯了這么多胧卤,終于進入正題了,分享一下我的面試經(jīng)歷拼岳。題目如下枝誊,破折線后面是簡單的解決思路。
百度
一面:約 1.5 小時
首先是四個算法題:
- 不用臨時變量怎么實現(xiàn) swap(a, b)——用加法或者異或都可以
- 二維有序數(shù)組查找數(shù)字——劍指 offer 第 3題
- 億級日志中惜纸,查找登陸次數(shù)最多的十個用戶——(不確定對不對侧啼,我的思路是)先用哈希表保存登陸次數(shù)和ID,然后用紅黑樹保存最大的十個數(shù)堪簿。劍指 offer 第 30題
- 簡述排序算法——快排,
partion
函數(shù)的原理皮壁,堆排(不穩(wěn)定)椭更,歸并排序,基數(shù)排序蛾魄。
然后有一個智力題虑瀑,沒完整的答出來湿滓,好像影響不是很大。
最后是 iOS 相關(guān)舌狗,面試官問的很開放叽奥,都是談?wù)勛约旱睦斫猓?/p>
- 說說你對 OC 中
load
方法和initialize
方法的異同⊥词蹋——主要說一下執(zhí)行時間朝氓,各自用途,沒實現(xiàn)子類的方法會不會調(diào)用父類的主届? - 說說你對 block 的理解赵哲。—— 三種 block君丁,棧上的自動復(fù)制到堆上枫夺,block 的屬性修飾符是 copy,循環(huán)引用的原理和解決方案绘闷。
- 說說你對 runtime 的理解橡庞。——主要是方法調(diào)用時如何查找緩存印蔗,如何找到方法扒最,找不到方法時怎么轉(zhuǎn)發(fā),對象的內(nèi)存布局喻鳄。
- 說說你對 MVC 和 MVVM 的理解扼倘。—— MVC 的 C 太臃腫除呵,可以和 V 合并再菊,變成 MVVM 中的 V,而 VM 用來將 M 轉(zhuǎn)化成 V 能用的數(shù)據(jù)颜曾。
- 說說 UITableView 的調(diào)優(yōu)纠拔。——一方面是通過 instruments 檢查影響性能的地方泛豪,另一方面是估算高度并在 runloop 空閑時緩存稠诲。
- 談?wù)勀銓?ARC 的理解。ARC 是編譯器完成的诡曙,依靠引用計數(shù)臀叙,談?wù)剮讉€屬性修飾符的內(nèi)存管理策略,什么情況下會內(nèi)存泄露价卤。
一面的問題非橙坝基礎(chǔ),主要是算法和 Objective-C慎璧,因為準備比較充分床嫌,基本上答出來 80% 吧跨释。大約一周后突然二面。
另附收集的大廠面試題厌处,進群可自行下載鳖谈!
- BAT大廠面試題、獨家面試工具包,
- 資料免費領(lǐng)取阔涉,包括 數(shù)據(jù)結(jié)構(gòu)缆娃、底層進階、圖形視覺洒敏、音視頻龄恋、架構(gòu)設(shè)計、逆向安防凶伙、RxSwift郭毕、flutter,
- (直接搜索群號:761407670函荣,進群密碼000显押,快速入群)
-
點擊此處,與iOS開發(fā)大牛一起交流學(xué)習(xí)傻挂,進群密碼000
二面:約 0.5 小時
二面比較突然乘碑,顯示簡單的自我介紹,然后問了三個問題:
- 野指針是什么金拒,iOS 開發(fā)中什么情況下會有野指針兽肤?——野指針是不為 nil,但是指向已經(jīng)被釋放的內(nèi)存的指針绪抛,不知道什么時候會有资铡,如果有知道的讀者還望提醒。
- 介紹 block幢码◇孕荩—— (接第一問) 我讓面試官提示我一下什么時候會有野指針,他說用 block 時症副,我表示還是不知道店雅,只知道 block 會有循環(huán)引用。于是就扯回了一面的問題贞铣。
- 說說你是怎么優(yōu)化 UITableView 的闹啦。——還是一面的問題辕坝。窍奋。。。费变。。圣贸。挚歧。。吁峻。滑负。
雖然通過了,但是幾乎又問了一遍一面的問題讓我感覺對方不太認真用含。
三面:北京 onsite矮慕,約 2.5 小時
首先是給一個小時,手寫算法兩個算法題啄骇。接下來問了 TCP 握手相關(guān)的痴鳄。最后問了 OC 的一些細節(jié)問題。
網(wǎng)易
筆試
主要是計算機方面的大雜燴缸夹,涉及操作系統(tǒng)痪寻,網(wǎng)絡(luò),移動開發(fā)虽惭,算法等橡类。難度不大,目測是為了淘汰渾水摸魚的人芽唇,就不列出題目了顾画,算法有三題,直接在線寫(木有 IDE 表示很憂傷):
- 很長一道題匆笤,讀了很久才讀懂研侣,目測是 DFS,但是最后沒時間了疚膊,寫了個思路义辕。
- 把 "www.zhidao.baidu.com" 這樣的字符串改成 "com/baidu/zhidao/www"≡⒌粒——老題目了灌砖,劍指 offer 的,兩次逆序排列即可傀蚌。
- 求數(shù)組中和為某個值的所有子數(shù)組基显,比如數(shù)組是
[5,5,10,2,3]
一共有四個子數(shù)組的和是 15,比如[5,10]
善炫,[5,10]
撩幽,[10,2,3]
,[5,5,2,3]
。這個就是簡單的遞歸了窜醉,分兩種情況宪萄,當前位置的數(shù)字在子數(shù)組中,以及不在子數(shù)組中榨惰。
一面
全部是 iOS 題拜英,可能是覺得算法已經(jīng)面過了:
- 介紹 block±糯撸——我提到棧上的 block 在 ARC 下會自動復(fù)制到堆上居凶,面試官問我從 iOS 4 還是 5 開始支持這一特性,表示不知道藤抡,我又不是學(xué) OC 歷史的侠碧,后來想想可能是公司內(nèi)部老項目有這個坑。
- ARC 會對代碼做什么優(yōu)化缠黍?——比如
NSString *s2 = s1; s2 = nil
這樣的語句弄兜,可能就不會有retain
和release
方法了。 - 介紹一下 MVVM 和 RAC嫁佳“ざ樱——可能是我簡歷的某個角落寫了用過 RAC,被挖出來了蒿往,大概談了一下盛垦,結(jié)果面試官問我數(shù)據(jù)的雙向綁定怎么做,
bind
函數(shù)了解過么瓤漏,果斷說已經(jīng)忘了?????? - 介紹自己用過哪些開源庫腾夯。——Masonry 和 SnapKit蔬充,AFNetWorking蝶俱,MKNetworkKit,Alamofire饥漫,Mantle榨呆,SDWebImage
- 如果讓你寫,你能實現(xiàn)么庸队?——當然不能积蜻,不然還要實習(xí)?
- 讀過某個庫的源碼么彻消?——扯了一點 SDWebImage竿拆,后來被告知這個庫用了 runloop 來保證滑動是加載數(shù)據(jù)的流暢性,自己看了源碼后表示沒有發(fā)現(xiàn)宾尚,唯一用到 runloop 地方是保證后臺線程一直跑丙笋,也有可能是我理解錯了谢澈,如果錯誤歡迎指正。
- SDWebImage 下載了圖片后為什么要解碼御板?——當時蒙住了锥忿,面試官很 nice 的解釋了一下,說是要把 png 文件建立一個什么內(nèi)存映射怠肋,目前還不太懂缎谷,有空研究一下。
本來以為面的這么差肯定是掛了灶似,沒想到還是過了一面。過了不到一個小時瑞你,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
相當于是數(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進制整數(shù)筹陵。其中刽锤,該計數(shù)法的2就對應(yīng)于十進制的2,之后依次遞增惶翻。C/C++函數(shù)接口: char* pokToDec(char *)
我的解決思路是進制轉(zhuǎn)換姑蓝,類似于 16 進制轉(zhuǎn)換 10 進制這種,最后再把數(shù)字轉(zhuǎn)成 char *
類型吕粗。
然后好像沒結(jié)果了纺荧,可能是編程實現(xiàn)太渣了?
其他我知道的面試題
阿里一面:
-
MVC
具有什么樣的優(yōu)勢,各個模塊之間怎么通信宙暇,比如點擊 Button 后 怎么通知 Model输枯? - 兩個無限長度鏈表(也就是可能有環(huán)) 判斷有沒有交點
-
UITableView
的相關(guān)優(yōu)化 -
KVO
、Notification
占贫、delegate
各自的優(yōu)缺點桃熄,效率還有使用場景 - 如何手動通知
KVO
- Objective-C 中的
copy
方法 - runtime 中,
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
的使用,如何處理多線程問題 - 如何設(shè)計圖片緩存烫葬?
- 有沒有自己設(shè)計過網(wǎng)絡(luò)控件界弧?
阿里二面:
- 怎么判斷某個
cell
是否顯示在屏幕上 - 進程和線程的區(qū)別
-
TCP
與UDP
區(qū)別 -
TCP
流量控制 - 數(shù)組和鏈表的區(qū)別
-
UIView
生命周期 - 如果頁面 A 跳轉(zhuǎn)到 頁面 B,A 的
viewDidDisappear
方法和 B 的viewDidAppear
方法哪個先調(diào)用搭综? -
block
循環(huán)引用問題 -
ARC
的本質(zhì) -
RunLoop
的基本概念垢箕,它是怎么休眠的? -
Autoreleasepool
什么時候釋放兑巾,在什么場景下使用条获? - 如何找到字符串中第一個不重復(fù)的字符
- 哈希表如何處理沖突
面試收獲
1. 算法題怎么答
面試官可能會問到你聞所未聞的算法,這時候你不應(yīng)該自己瞎想蒋歌,而是先和面試官把問題討論清楚月匣。要知道,通過溝通弄明白復(fù)雜的問題也是一種能力奋姿,在和面試官交流的過程中锄开,不僅僅可以搞清楚題目真正的意思是什么,還可以展現(xiàn)自己良好的交流溝通能力称诗。所以千萬不要因為緊張或者害羞而浪費這次大好的機會萍悴。
有些題目似曾相識光酣,但是暫時沒有思路蚕苇。這時候不妨告訴面試官党巾,給我一些時間思考這個題法绵。然后不要急,不要慌动壤,就當他不存在逃呼,拿出紙和筆慢慢算(這充分說明了面試戴耳機的重要性)做裙。你一定要堅定一個信念:“任何一道稍微有難度的算法題蜈首,除非做過实抡,否則一定是需要時間想的”欠母。所以,合理的安排思考時間吧吆寨。如果十幾分鐘都想不出來赏淌,可以直接放棄。
有時候面試官會要求在線編程啄清,相信我六水,他不會無聊到盯著你的代碼看的,面試官一般都很忙辣卒,他也有自己的工作要完成掷贾,所以你就當是用自己的 IDE 就好。在線編程往往是一個中等難度的問題荣茫,所以不要自己嚇唬自己胯盯。同時要注意代碼格式的規(guī)范,適當?shù)淖⑨尲坡叮崆熬帉懞脺y試用例等,即使沒有解決問題憎乙,也至少要把自己良好的編程習(xí)慣展示給面試官票罐。
2. 遇到不會的問題怎么處理
這個問題有可能是面試官故意說得含糊不清,考察你的交流能力泞边,也有可能是無意的该押,或者是你的理解方式出現(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ù)我的推理仅乓,可能會有……”赖舟。
3. 遇到真的不會的問題怎么處理
遇到不會的問題果斷承認啊。如果是基本問題夸楣,比如問你哈希表怎么實現(xiàn)宾抓,你說不會,那么這次面試可能就懸了豫喧。如果是有一定難度的問題石洗,那么你承認不會,也是一種明智之舉紧显,畢竟人無完人讲衫,一個問題不會并不能全盤否定一個人的能力。
但是比較糟糕的一種情況是孵班,面試者由于過分緊張涉兽,擔心答不上面試官的問題會有嚴重后果,所以嘗試著去敷衍面試官篙程。比如:“我猜是 xxx 吧”枷畏,“我覺得可能是 ……”,更有甚者直接裝逼:“這個我試過虱饿,不就是 xxx 么”矿辽。要知道,此時的你郭厌,由于緊張袋倔,在心態(tài)上已經(jīng)輸給了面試官,更何況面試官問你的問題一定是他有把握的折柠,你覺得這時候你負隅頑抗會有幾成勝算呢宾娜?
所以,面試官問我“堆排序”的細節(jié)時扇售,由于我當時忘了堆排序是怎么實現(xiàn)的前塔,所以我直接告訴他我記不清了嚣艇。另一個主動認輸?shù)睦邮敲嬖嚬賳栁?RAC 如何實現(xiàn)雙向綁定,我告訴他這個是我當時學(xué)習(xí)的時候?qū)戇^的 demo华弓,因為不常用食零,已經(jīng)只記得一些簡單的概念了。
最后寂屏,還需要保持一個平穩(wěn)的心態(tài):“面試時盡力就好贰谣,遇到自己不會的問題也是正常情況”。如果面試者順利答對了所有問題迁霎,難免會讓面試官感到一絲尷尬吱抚,面試者也有可能會產(chǎn)生一些別的情緒。所以考廉,我們要做的只是把自己的能力展示給面試官秘豹,做到不驕不躁。
4. 準備殺手锏
除了能夠回答上面試官的問題以外昌粤,我建議自己準備一兩個殺手锏級別的話題既绕。所謂的殺手锏,至少具備以下幾個特征:
- 你親自動手試驗過涮坐。所謂實踐是檢驗真理的唯一標準凄贩,數(shù)據(jù)是不會說謊的。
- 問題有足夠的深度膊升。一面的面試官可能是你的直接上司,二面一般就是更改級別的谭企。你的深度一定要遠超其他面試者廓译,讓一面面試官覺得自己沒有十足把握,讓二面面試官覺得這是一個好話題债查,自己的手下都不一定能有這么獨到深刻的見解非区。
- 你對這個問題理解的足夠深入,無論是廣度還是深度都達到一定水平盹廷。
以 iOS 中的 UITableView
的調(diào)優(yōu)為例征绸,我自認為對它有一定的理解,同為 iOS 開發(fā)者的讀者可以閱讀這篇文章:UIKit性能調(diào)優(yōu)實戰(zhàn)講解俄占,同時我還仔細研究了 sunnyxx 大神的 優(yōu)化UITableViewCell高度計算的那些事管怠。
這一類的話題通常需要仔細研究官方文檔,iOS 開發(fā)者還可以觀看 WWDC 視頻缸榄,然后花上充足的時間去總結(jié)渤弛。比如我寫 iOS自定義轉(zhuǎn)場動畫實戰(zhàn)講解 這篇文章就花了至少三天時間,包括大年初一一整天甚带。
由于此類話題數(shù)量不多她肯,所以準備一個或數(shù)個即可佳头,面試時可以有意識的將面試官引導(dǎo)到這些話題上去,從而充分的展示自己晴氨。
5. 心態(tài)
通常情況下康嘉,面試結(jié)果都會在 1 - 3 天內(nèi)知道。有的面試官會當場告訴你通過了籽前,有的公司面試結(jié)束后幾個小時就能出結(jié)果亭珍。
但有些時候,由于某些原因(我也不清楚聚假。块蚌。。膘格∏头叮可能是比較忙?)瘪贱,你遲遲無法獲知面試結(jié)果纱控。這時候你可以選擇耐心等待,獲知直接給 HR or 內(nèi)推者發(fā)送郵件菜秦。一般來說面試結(jié)束后三天還沒收到通知甜害,你可以發(fā)送郵件詢問或者再等等。
復(fù)習(xí)資料
對于讀到這一段的讀者球昨,為了感謝你耐心的聽我廢話了這么久尔店,送上一波精心整理的干貨和資料。不敢說完全沒有錯主慰,但是應(yīng)該比自己去查要靠譜得多嚣州。主要涉及算法、網(wǎng)絡(luò)共螺、操作系統(tǒng)该肴、Objective-C 和 iOS 五個方面。如果你不是 iOS 開發(fā)者藐不,相信前三部分的資料也或多或少能夠幫上你匀哄。
算法
這一部分的內(nèi)容主要分為以下幾個部分:字符串、數(shù)組與查找雏蛮、鏈表涎嚼、樹以及其他基礎(chǔ)問題。
總的來說挑秉,算法問題可以分為以下三類:
- 基礎(chǔ)問題:即使是新手铸抑,一眼看過去就有思路,只是實現(xiàn)的時候需要注意細節(jié)衷模。
- 普通問題:這些問題通常屬于以上分類中的某一類鹊汛,需要面試者掌握一些常見的思路蒲赂,比如遞歸、動態(tài)規(guī)劃刁憋、BFS/DFS滥嘴、雙指針、二分搜索 等至耻∪糁澹或者是直接考察數(shù)據(jù)結(jié)構(gòu)的使用,如:哈希尘颓、棧和隊列走触、鏈表等,如果具備了這些基礎(chǔ)知識疤苹,此類題目通常能夠比較快速的解決互广。
- 進階問題:這些題的解題思路和普通問題相似,但是需要你事先有對應(yīng)的知識積累卧土,否則難以直接看出問題的本質(zhì)惫皱。
- 疑難雜題:這類問題比較奇怪,解決它以后并不能給別的題目太多幫助尤莺,如果時間緊張可以暫時放棄旅敷。
一般來說,一類問題難度不大颤霎,面試前簡單復(fù)習(xí)一下媳谁,面試時小心仔細,全面思考即可友酱。二三類問題是面試重點晴音,需要提前準備。第四類問題通常出現(xiàn)較少粹污,即使不會做段多,對最終評價的負面影響也不會有前三類那么大首量。
如果時間充裕壮吩,我建議閱讀《劍指 Offer》這本書并配合 Leetcode 來鞏固知識,在我的面試過程中加缘,出現(xiàn)很多書上的原題或者變體鸭叙,我自認為沒有因為算法而影響任何一次面試的成績。如果時間緊張拣宏,你也可以只完成我列出的一些經(jīng)典題目沈贝,在“【】”中標記了我對此題類型的分類,如果加星號表示此題在實際面試中出現(xiàn)過勋乾。
PS: 最近有小伙伴被問到了哈希表的實現(xiàn)宋下。這可以理解為算法嗡善,也可以歸類為計算機基礎(chǔ)知識⊙纾總的來說你至少需要明白哈希值的特點和兩種解決沖突的方式:拉鏈式和開放尋址罩引。
字符串
動態(tài)規(guī)劃
數(shù)組
- 【3】求兩個等長、有序數(shù)組的中位數(shù)(二分法)
- 【4】求兩個不等長枝笨、有序數(shù)組的中位數(shù)
- 【3】旋轉(zhuǎn)數(shù)組求最小值袁铐、【3】旋轉(zhuǎn)數(shù)組求查找某個值是否存在(二分法)
- 【4*】每行從左到右,每列從上到下遞增的二維數(shù)組中横浑,判斷某個數(shù)是否存在(劍指 offer 第 3 題)
- 【3*】數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字
- 【3*】第 k 大的數(shù)(拓展:最大的 k 個數(shù))
- 【3*】有序數(shù)組中某個數(shù)字出現(xiàn)的次數(shù)(提示:利用二分搜索)
鏈表
- 【2】反轉(zhuǎn)鏈表(使用遞歸和迭代兩種解法剔桨,了解頭插法)
- 【3】刪除鏈表的當前節(jié)點
- 【3】刪除倒數(shù)第 k 個節(jié)點
- 【1】兩個有序鏈表合并
- 【4】復(fù)雜鏈表的復(fù)制
- 【2*】判斷鏈表是否有環(huán)
- 【3*】兩個鏈表的第一個公共節(jié)點(提示:考慮鏈表有環(huán)的情況)
- 【3】刪除鏈表中重復(fù)節(jié)點
樹
- 【3】根據(jù)中序和后序遍歷結(jié)果重建二叉樹、【3】根據(jù)中序和前序遍歷結(jié)果重建二叉樹
- 【2】翻轉(zhuǎn)二叉樹
- 【2】從上往下打印二叉樹 (BFS 的思想)
- 【3】判斷某個數(shù)組是不是二叉樹的后序遍歷結(jié)果 (劍指 offer 第 24 題)
- 【3】二叉樹中和為某個值的路徑
- 【3*】二叉樹中某個節(jié)點的下一個節(jié)點 (強烈推薦準備一下徙融,劍指 offer 第 58 題)
棧
- 【2】用兩個棧實現(xiàn)隊列洒缀、【2】用兩個隊列實現(xiàn)棧
- 【2】實現(xiàn)一個棧,可以用常數(shù)級時間找出棧中的最小值
- 【3】判斷棧的壓棧张咳、彈棧序列是否合法(劍指offer 第 22 題)
排序
了解以下排序的時間帝洪、空間復(fù)雜度,是否穩(wěn)定脚猾,實現(xiàn)原理
- 歸并排序葱峡、拓展:求數(shù)組中的逆序?qū)€數(shù)
-
快速排序 重點:
partion
函數(shù)的實現(xiàn) - 堆排序
- 數(shù)組元素值域已知時,考慮 基數(shù)排序 和 桶排序
位運算
- 【2】給一個十進制數(shù)字龙助,求它的二進制表示中砰奕,有多少個 1 (n &= n - 1)
- 【3】給一個數(shù)組,所有數(shù)字都出現(xiàn)了偶數(shù)次提鸟,只有一個出現(xiàn)了一次军援,找出這個數(shù)
- 【4】給一個數(shù)組,所有數(shù)字都出現(xiàn)了三次称勋,只有一個出現(xiàn)了一次胸哥,找出這個數(shù)
- 【3】給一個數(shù)組,所有數(shù)組都出現(xiàn)了偶數(shù)次赡鲜,只有兩個數(shù)字出現(xiàn)了一次空厌,找出這兩個數(shù)
網(wǎng)絡(luò)層
根據(jù)不同的面試崗位,側(cè)重點略有不同银酬。對 iOS 和 Android 開發(fā)者來說嘲更,HTTP 考的略少,以 TCP 和 UDP 為主揩瞪。其實 UDP 基本上只會考察和 TCP 的區(qū)別赋朦。
當然還有一些常見的基礎(chǔ)問題,比如 Cookie 和 Session 的考察,POST 和 GET 的考察宠哄,HTTPS 的簡單了解等壹将。這些問題在我的博客中都有簡單的總結(jié)。
總結(jié)了一些資料毛嫉,數(shù)字序號越大的資料表示篇幅更長瞭恰,耗時更久,難度更大狱庇,講解更細致惊畏。破折線后表示預(yù)計需要多久可以讀完。
- 【博客】我的六篇總結(jié)————不到一周
- 【書】圖解 TCP/IP————半個月
- 【書】TCP/IP 詳解————沒讀過密任,感覺至少需要一個月
- 【書】TCP/IP 協(xié)議簇————沒讀過颜启,感覺至少需要一個月
光讀書是沒有用的,一問到實際問題很容易懵逼浪讳,以下是我總結(jié)的一些問題:
- 簡介 TCP 和 UDP 區(qū)別缰盏,他們位于哪一層?
- 路由器和交換機的工作原理大概是什么淹遵,他們分別用到什么協(xié)議口猜,位于哪一層?
- 描述TCP 協(xié)議三次握手透揣,四次釋放的過程济炎。
- TCP 協(xié)議是如何進行流量控制,擁塞控制的辐真?
- 為什么建立連接時是三次握手须尚,兩次行不行?如果第三次握手失敗了怎么處理
- 關(guān)閉連接時侍咱,第四次握手失敗怎么處理耐床?
- 你怎么理解分層和協(xié)議?
- HTTP 請求中的 GET 和 POST 的區(qū)別楔脯,Session 和 Cookie 的區(qū)別撩轰。
- 談?wù)勀銓?HTTP 1.1,2.0 和 HTTPS 的理解昧廷。
操作系統(tǒng)與編譯
我被問到的操作系統(tǒng)問題很少堪嫂,所以僅僅總結(jié)了一些自認為比較重要的問題。關(guān)于這一部分的知識麸粮,推薦閱讀《程序員的自我修養(yǎng)》溉苛,如果時間有限镜廉,你可以閱讀我的《程序員的自我修養(yǎng)讀書筆記》弄诲,并思考這些問題:
- 源代碼是怎么變成可執(zhí)行文件的,每一步的作用是什么?(預(yù)編譯齐遵,詞法分析寂玲,語法分析,語義分析梗摇,中間語言生成目標代碼生成拓哟,匯編,鏈接)
- 應(yīng)用層伶授、API断序、運行庫、系統(tǒng)調(diào)用糜烹、操作系統(tǒng)內(nèi)核之間的關(guān)系是什么违诗?
- 虛擬內(nèi)存空間是什么,為什么要有虛擬內(nèi)存空間疮蹦。
- 靜態(tài)鏈接和動態(tài)鏈接分別表示什么诸迟,大概是怎么實現(xiàn)的?
- 可執(zhí)行文件的結(jié)構(gòu)如何愕乎?(分為哪些段)
- 它是怎么裝載進內(nèi)存的阵苇,為什么要分段,分頁感论,頁錯誤是什么绅项?
- 進程的內(nèi)存格局是怎樣的?(堆比肄、棧趁怔、全局/靜態(tài)區(qū),代碼區(qū)薪前,常量區(qū))
- 堆和棧的區(qū)別润努,函數(shù)調(diào)用和棧的關(guān)系
- 進程和線程的區(qū)別
- 異步和同步,串行示括,并發(fā)铺浇,并行的區(qū)別
- 多并發(fā)任務(wù),僅多線程能加快速度么(不能垛膝,會變慢鳍侣,有線程切換的開銷)
- 多個線程之間可以共享那些數(shù)據(jù)
- 進程之間如何通信
- 介紹幾種鎖,他們的用途和區(qū)別
關(guān)于多線程相關(guān)的吼拥,推薦閱讀這篇文章的前面一小部分——《iOS多線程編程——GCD與NSOperation總結(jié)》
關(guān)于操作系統(tǒng)和編譯方面的文章倚聚,除了讀原書和我的讀書筆記外,還可以參考這篇文章——《修改一個數(shù)字破解Mac上的應(yīng)用》
OC
首先兩本必備的神書一定是要讀完的凿可。一本是講 OC 的《Effective Objective-C 2.0》惑折,中文名叫:“編寫高質(zhì)量 iOS 與 OS X 代碼的 52 個有效方法”授账。另一本書叫:《Objective-C 高級編程》。前者講解 OC 中各種細節(jié)惨驶,后者主要講了 ARC白热、Block 和 GCD。
光是讀書粗卜,思考不夠屋确,很容易在面試時被問懵逼,所以建議一遍嘗試回答面試真題续扔,一邊閱讀以下總結(jié)性的文章攻臀,重要性不分先后:
- 檢測內(nèi)存泄露
- KVO與KVC原理、KVO纱昧、Notification茵烈、Delegate優(yōu)缺點、最推薦的官方文檔
- GCD 與 NSOperation
- Runtime
- block
- atomic 線程安全砌些、@synchronized
- 對象的深淺復(fù)制
- 招聘一個靠譜的iOS
- 消息傳遞機制
- 深入理解Objective-C:Category
強烈推薦第八篇文章呜投,做完這上面的題目基本上可以應(yīng)付大多數(shù) OC 方面的問題了。
iOS 開發(fā)
- RunLoop
- Cell 圖片異步加載優(yōu)化
- iOS 函數(shù)式編程的實現(xiàn) && 響應(yīng)式編程概念
- 內(nèi)存惡鬼drawRect
- UIKit 性能調(diào)優(yōu)(主要是UITableView)
- 優(yōu)化UITableViewCell高度計算的那些事
- 高性能圖片架構(gòu)與設(shè)計
- 輕量化視圖控制器
- UIView的生命周期
- 高效設(shè)置圓角
- 事件的傳遞和響應(yīng)機制
- ReactiveCocoa 和 MVVM 入門
其中需要重點了解 runloop
存璃,它不僅僅是簡單的“跑圈”的 概念仑荐,很多問題其實都與它有關(guān),建議認真閱讀 ibireme 大神的總結(jié)
其他面經(jīng)
- 直擊2020——iOS 面試題大全(補充完整版)
- “新”攜程纵东,阿里粘招,騰訊iOS面試常見問題合集(附答案)
- 我是如何同時拿到阿里和騰訊offer的
- 騰訊&阿里&美團&快手&字節(jié)等10公司面經(jīng)
- 騰訊社招iOS面試記錄
- 最新阿里騰訊頭條美團等iOS面試總結(jié)
作為一個開發(fā)者,有一個學(xué)習(xí)的氛圍跟一個交流圈子特別重要偎球,這是一個我的iOS交流群:761407670 進群密碼000洒扎,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題衰絮、面試經(jīng)驗袍冷,討論技術(shù), 大家一起交流學(xué)習(xí)成長猫牡!
進群可自行下載胡诗!