有一位小夥伴面試阿里被拒後,面試官給出了這樣的評價:「……計算機基礎,以及編程基礎能力上都有所欠缺……」。但這種籠統的回答並不是是咱們但願的答案,所謂的基礎到底指的是什麼?php
做爲一名 iOS 開發者,我所理解的基礎是 操做系統、網絡和算法這三大塊,不一樣的開發方向可能有不一樣的側重,但基礎總的來講就是這些。我不推薦經過去網上看教程來學習這些基礎知識,由於能用短短几篇文章講明白的事情不叫基礎,至少我沒見過寫得這麼深刻淺出的文章。html
不知道有多少讀者和我同樣有過這樣的困擾:「我知道某些東西很重要,因此去百度查了資料,可是查到的文章質量不好,正確率沒有保證」。這實際上是正常的,優秀的文章通常都放在優秀的做者的我的博客上,這偏偏是搜索引擎的盲區,因此通常只能搜到 CSDN、博客園這種地方的文章。天然就沒法保證文章質量。node
出於這種考慮,我在文章最後的複習資料中,提供了用於學習相關基礎知識的書籍,若是您剛好是 iOS 開發者,還能夠閱讀我收集的一些高質量文章,正確性比較有保證(我寫的除外)。ios
除了準備通用的基礎知識之外,簡歷也是一個很重要的環節。一直很仰慕唐巧老師的猿題庫,無奈簡歷太差,都沒有收到面試邀請。後來好好改了簡歷之後,就沒有這種問題了。關於簡歷的書寫,推薦兩篇文章:如何寫面向互聯網公司的求職簡歷、程序猿簡歷模板。你也能夠參考個人簡歷,沒有亮點,就當是拋磚引玉。git
最後,固然是準備好相關崗位的基礎知識了。做爲 iOS 開發者,雖然 Swift 已經發布了快兩年,可是大公司轉向 Swift 的動做還不明顯,因此 Objective-C 幾乎是必備項,Swift 都不必定能算是加分項。iOS 方面的知識也必不可少,雖然招聘信息上寫着若是基礎紮實,零 iOS 基礎也能夠,可是現實每每是比較殘酷的。程序員
扯了這麼多,終於進入正題了,分享一下個人面試經歷。題目以下,破折線後面是簡單的解決思路。github
首先是四個算法題:面試
partion
函數的原理,堆排(不穩定),歸併排序,基數排序。而後有一個智力題,沒完整的答出來,好像影響不是很大。正則表達式
最後是 iOS 相關,面試官問的很開放,都是談談本身的理解:算法
load
方法和 initialize
方法的異同。——主要說一下執行時間,各自用途,沒實現子類的方法會不會調用父類的?一面的問題很是基礎,主要是算法和 Objective-C,由於準備比較充分,基本上答出來 80% 吧。大約一週後忽然二面。
二面比較忽然,顯示簡單的自我介紹,而後問了三個問題:
雖然經過了,可是幾乎又問了一遍一面的問題讓我感受對方不太認真。
首先是給一個小時,手寫算法兩個算法題。接下來問了 TCP 握手相關的。最後問了 OC 的一些細節問題。
主要是計算機方面的大雜燴,涉及操做系統,網絡,移動開發,算法等。難度不大,目測是爲了淘汰渾水摸魚的人,就不列出題目了,算法有三題,直接在線寫(木有 IDE 表示很憂傷):
[5,5,10,2,3]
一共有四個子數組的和是 15,好比 [5,10]
,[5,10]
,[10,2,3]
,[5,5,2,3]
。這個就是簡單的遞歸了,分兩種狀況,當前位置的數字在子數組中,以及不在子數組中。所有是 iOS 題,多是以爲算法已經面過了:
NSString *s2 = s1; s2 = nil
這樣的語句,可能就不會有 retain
和 release
方法了。bind
函數了解過麼,果斷說已經忘了😂😂😂原本覺得面的這麼差確定是掛了,沒想到仍是過了一面。過了不到一個小時,HR 電話打過來,約了兩天後二面。
純數學和算法:
下面這段代碼的輸出結果是:
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
是指向數組開頭元素的指針,a + 1
就是指向下一個元素的指針,因此星號求值之後是 2。&a
至關因而數組的指針,&a + 1
是數組後面一個數組的指針,而後轉換成int *
類型是 5 這個數字後面的一個數字的指針。再減一就是指向 5 的指針,因此星號求值之後是 5。
某個地方天氣有以下規律:若是第一天和次日都不下雨,則第三天下雨的機率爲30%;若是第一天和次日中有任 意一天下雨,則第三天下雨的機率爲60%。問若是週一週二都沒下雨,那麼週四下雨的機率爲_。
簡單的機率題,答案是:30% * 60% + 70% * 30% = 39%
某癡迷撲克的小團體喜歡用23456789TJQKA來計數,A後面是22,23,...,2A,32,...,AA,222,... 依次類推。
請用C/C++或Java寫個程序,將用字符串表示這種計數法轉換成字符串表示的10進制整數。其中,該計數法的2就對應於十進制的2,以後依次遞增。C/C++函數接口: char pokToDec(char )
個人解決思路是進制轉換,相似於 16 進制轉換 10 進制這種,最後再把數字轉成 char *
類型。
而後好像沒結果了,多是編程實現太渣了?
MVC
具備什麼樣的優點,各個模塊之間怎麼通訊,好比點擊 Button 後 怎麼通知 Model?UITableView
的相關優化KVO
、Notification
、delegate
各自的優缺點,效率還有使用場景KVO
copy
方法SEL
和 IMP
的區別autoreleasepool
的使用場景和原理RunLoop
的實現原理和數據結構,何時會用到block
爲何會有循環引用GCD
如何實現這個需求:A、B、C 三個任務併發,完成後執行任務 D。NSOperation
和 GCD
的區別CoreData
的使用,如何處理多線程問題cell
是否顯示在屏幕上TCP
與 UDP
區別TCP
流量控制UIView
生命週期viewDidDisappear
方法和 B 的 viewDidAppear
方法哪一個先調用?block
循環引用問題ARC
的本質RunLoop
的基本概念,它是怎麼休眠的?Autoreleasepool
何時釋放,在什麼場景下使用?面試官可能會問到你聞所未聞的算法,這時候你不該該本身瞎想,而是先和麪試官把問題討論清楚。要知道,經過溝通弄明白複雜的問題也是一種能力,在和麪試官交流的過程當中,不只僅能夠搞清楚題目真正的意思是什麼,還能夠展示本身良好的交流溝通能力。因此千萬不要由於緊張或者害羞而浪費此次大好的機會。
有些題目似曾相識,可是暫時沒有思路。這時候不妨告訴面試官,給我一些時間思考這個題。而後不要急,不要慌,就當他不存在,拿出紙和筆慢慢算(這充分說明了面試戴耳機的重要性)。你必定要堅決一個信念:「任何一道稍微有難度的算法題,除非作過,不然必定是須要時間想的」。因此,合理的安排思考時間吧。若是十幾分鍾都想不出來,能夠直接放棄。
有時候面試官會要求在線編程,相信我,他不會無聊到盯着你的代碼看的,面試官通常都很忙,他也有本身的工做要完成,因此你就當是用本身的 IDE 就好。在線編程每每是一箇中等難度的問題,因此不要本身嚇唬本身。同時要注意代碼格式的規範,適當的註釋,提早編寫好測試用例等,即便沒有解決問題,也至少要把本身良好的編程習慣展現給面試官。
這個問題有多是面試官故意說得含糊不清,考察你的交流能力,也有多是無心的,或者是你的理解方式出現了誤差。無論是以上哪一種問題,你都應該先和麪試官交流,直到你搞懂了面試官要問你什麼,而不是按照本身的理解說了一堆無用的東西。
舉個例子,面試官可能會問了一道算法題:「如何判斷兩個無限長度的鏈表是否有交點?」。對於「無限長度」能夠有不一樣的理解,若是真的是有無窮多個節點,那顯然這個問題是沒法解決的。但若是鏈表僅僅是有環,那麼仍是能夠解決的。若是面試官的本意是鏈表有環,但你錯誤的理解成了無窮多個節點,那麼必然會致使沒法回答這個問題。並且這並不是能力不足,而是屬於交流溝通方面的失誤,這也正是我想分享的「技巧」。
還有一些問題,雖然你沒有接觸過,可是因爲對相似的問題或者狀況有過思考,因此能夠合理假設。好比面試官問 「ARC 會對代碼作什麼樣的優化?」。咱們知道 ARC 的本質就是在合適的地方插入 retain
和 release
等方法,那麼就應該從這個角度出發去思考問題。
顯然分別執行 retain
和 release
操做是沒有必要的,那麼就能夠構造出相應的例子:
NSString *s1 = @"hello"; NSString *s2 = s1; NSString *s2 = nil;
因爲這種問題咱們沒有真正實踐過,因此能夠委婉的告訴面試官:「根據個人推理,可能會有……」。
遇到不會的問題果斷認可啊。若是是基本問題,好比問你哈希表怎麼實現,你說不會,那麼此次面試可能就懸了。若是是有必定難度的問題,那麼你認可不會,也是一種明智之舉,畢竟人無完人,一個問題不會並不能全盤否認一我的的能力。
可是比較糟糕的一種狀況是,面試者因爲過度緊張,擔憂答不上面試官的問題會有嚴重後果,因此嘗試着去敷衍面試官。好比:「我猜是 xxx 吧」,「我以爲多是 ……」,更有甚者直接裝逼:「這個我試過,不就是 xxx 麼」。要知道,此時的你,因爲緊張,在心態上已經輸給了面試官,更況且面試官問你的問題必定是他有把握的,你以爲這時候你負隅頑抗會有幾成勝算呢?
因此,面試官問我「堆排序」的細節時,因爲我當時忘了堆排序是怎麼實現的,因此我直接告訴他我記不清了。另外一個主動認輸的例子是面試官問我 RAC 如何實現雙向綁定,我告訴他這個是我當時學習的時候寫過的 demo,由於不經常使用,已經只記得一些簡單的概念了。
最後,還須要保持一個平穩的心態:「面試時盡力就好,遇到本身不會的問題也是正常狀況」。若是面試者順利答對了全部問題,不免會讓面試官感到一絲尷尬,面試者也有可能會產生一些別的情緒。因此,咱們要作的只是把本身的能力展現給面試官,作到不驕不躁。
除了可以回答上面試官的問題之外,我建議本身準備一兩個殺手鐗級別的話題。所謂的殺手鐗,至少具有如下幾個特徵:
以 iOS 中的 UITableView
的調優爲例,我自認爲對它有必定的理解,同爲 iOS 開發者的讀者能夠閱讀這篇文章:UIKit性能調優實戰講解,同時我還仔細研究了 sunnyxx 大神的 優化UITableViewCell高度計算的那些事。
這一類的話題一般須要仔細研究官方文檔,iOS 開發者還能夠觀看 WWDC 視頻,而後花上充足的時間去總結。好比我寫 iOS自定義轉場動畫實戰講解 這篇文章就花了至少三天時間,包括大年初一一成天。
因爲此類話題數量很少,因此準備一個或數個便可,面試時能夠有意識的將面試官引導到這些話題上去,從而充分的展現本身。
一般狀況下,面試結果都會在 1 - 3 天內知道。有的面試官會當場告訴你經過了,有的公司面試結束後幾個小時就能出結果。
但有些時候,因爲某些緣由(我也不清楚。。。。多是比較忙?),你遲遲沒法獲知面試結果。這時候你能夠選擇耐心等待,獲知直接給 HR or 內推者發送郵件。通常來講面試結束後三天還沒收到通知,你能夠發送郵件詢問或者再等等。
對於讀到這一段的讀者,爲了感謝你耐心的聽我廢話了這麼久,送上一波精心整理的乾貨和資料。不敢說徹底沒有錯,可是應該比本身去查要靠譜得多。主要涉及算法、網絡、操做系統、Objective-C 和 iOS 五個方面。若是你不是 iOS 開發者,相信前三部分的資料也或多或少可以幫上你。
這一部分的內容主要分爲如下幾個部分:字符串、數組與查找、鏈表、樹以及其餘基礎問題。
總的來講,算法問題能夠分爲如下三類:
通常來講,一類問題難度不大,面試前簡單複習一下,面試時當心仔細,全面思考便可。二三類問題是面試重點,須要提早準備。第四類問題一般出現較少,即便不會作,對最終評價的負面影響也不會有前三類那麼大。
若是時間充裕,我建議閱讀《劍指 Offer》這本書並配合 Leetcode 來鞏固知識,在個人面試過程當中,出現不少書上的原題或者變體,我自認爲沒有由於算法而影響任何一次面試的成績。若是時間緊張,你也能夠只完成我列出的一些經典題目,在「【】」中標記了我對此題類型的分類,若是加星號表示此題在實際面試中出現過。
PS: 最近有小夥伴被問到了哈希表的實現。這能夠理解爲算法,也能夠歸類爲計算機基礎知識。總的來講你至少須要明白哈希值的特色和兩種解決衝突的方式:拉鍊式和開放尋址。
字符串
動態規劃
數組
鏈表
樹
棧
排序
瞭解如下排序的時間、空間複雜度,是否穩定,實現原理
位運算
根據不一樣的面試崗位,側重點略有不一樣。對 iOS 和 Android 開發者來講,HTTP 考的略少,以 TCP 和 UDP 爲主。其實 UDP 基本上只會考察和 TCP 的區別。
固然還有一些常見的基礎問題,好比 Cookie 和 Session 的考察,POST 和 GET 的考察,HTTPS 的簡單瞭解等。這些問題在個人博客中都有簡單的總結。
總結了一些資料,數字序號越大的資料表示篇幅更長,耗時更久,難度更大,講解更細緻。破折線後表示預計須要多久能夠讀完。
光讀書是沒有用的,一問到實際問題很容易懵逼,如下是我總結的一些問題:
我被問到的操做系統問題不多,因此僅僅總結了一些自認爲比較重要的問題。關於這一部分的知識,推薦閱讀《程序員的自我修養》,若是時間有限,你能夠閱讀個人《程序員的自我修養讀書筆記》,並思考這些問題:
關於多線程相關的,推薦閱讀這篇文章的前面一小部分——《iOS多線程編程——GCD與NSOperation總結》
關於操做系統和編譯方面的文章,除了讀原書和個人讀書筆記外,還能夠參考這篇文章——《修改一個數字破解Mac上的應用》
首先兩本必備的神書必定是要讀完的。一本是講 OC 的《Effective Objective-C 2.0》,中文名叫:「編寫高質量 iOS 與 OS X 代碼的 52 個有效方法」。另外一本書叫:《Objective-C 高級編程》。前者講解 OC 中各類細節,後者主要講了 ARC、Block 和 GCD。
光是讀書,思考不夠,很容易在面試時被問懵逼,因此建議一遍嘗試回答面試真題,一邊閱讀如下總結性的文章,重要性不分前後:
強烈推薦第八篇文章,作完這上面的題目基本上能夠應付大多數 OC 方面的問題了。
其中須要重點了解 runloop
,它不只僅是簡單的「跑圈」的 概念,不少問題其實都與它有關,建議認真閱讀 ibireme 大神的總結