1. 程式人生 > >2018 BAT春招已經開始,已拿Offer的百度,阿里的iOS面試總結分享給你(附面經)

2018 BAT春招已經開始,已拿Offer的百度,阿里的iOS面試總結分享給你(附面經)

前言:

隨著各大公司春招的開始,很多小夥伴都行動起來了,因此這篇總結並不一定適合想去創業公司的同學。另外,由於經驗本來就是主觀性極強的東西,加之筆者水平有限,所以如果有不認可的地方,萬望諸君呵呵一笑,拋之腦後。

接下來,我就斗膽分享一下自己在準備和參加面試的過程中的收穫、對面試的思考,以及一些可能對大家有用的建議,希望能幫助每位讀者找到自己心儀的工作。

作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要這是一個我的iOS交流群:638302184,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!

什麼是面試

有些人可能會把面試看的太重,覺得面試過了就能進入大廠,技術和財富兼得……

我倒是覺得,面試沒有這麼誇張(抱歉做了一回標題黨),它其實是一次你和麵試官互相瞭解的絕佳機會,藉此機會你還可以對未來的工作有初步的瞭解。

面試本身並不能完全評價一個人的實力。面試通過的人,也許只是恰好在面試時遇到了自己熟悉的問題,面試不通過,也有可能是面試官自身的問題,並非每個面試官都具備客觀評價別人的能力。

換句話說,面試沒通過也許是面試官沒有發現你的才華,面試通過了也並不代表你就能勝任工作,因為進入企業之後可不是每天負責回答面試題!

所以從這一點來看,面試有點像相親。你滿意我,我滿意你,王八對綠豆——看上眼了,那就一拍即合,否則就分道揚鑣。我本人非常希望能夠多幾輪面試(實際並不總是能做到),這樣大家都有充足的時間互相瞭解,決定去留。

網上某些面經中,介紹了一些“裝逼”的方法,還有所謂的“面試技巧”,我是不太認可的。技巧需要有,這是為了讓你更好的展示自己,而非坑蒙拐騙,無理取鬧,無中生有。我更想展現一個真實的自己,如果面試官不認可,說明我們沒有緣分,或者說自己的能力還不夠。

面試要準備什麼

有一位小夥伴面試阿里被拒後,面試官給出了這樣的評價:“……計算機基礎,以及程式設計基礎能力上都有所欠缺……”。但這種籠統的回答並非是我們希望的答案,所謂的基礎到底指的是什麼?

作為一名 iOS 開發者,我所理解的基礎是 作業系統、網路和演算法這三大塊,不同的開發方向可能有不同的側重,但基礎總的來說就是這些。我不推薦通過去網上看教程來學習這些基礎知識,因為能用短短几篇文章講明白的事情不叫基礎,至少我沒見過寫得這麼深入淺出的文章。

不知道有多少讀者和我一樣有過這樣的困擾:“我知道某些東西很重要,所以去百度查了資料,但是查到的文章質量很差,正確率沒有保證”。這其實是正常的,優秀的文章一般都放在優秀的作者的個人部落格上,這恰恰是搜尋引擎的盲區,所以一般只能搜到 CSDN、部落格園這種地方的文章。自然就無法保證文章質量。

除了準備通用的基礎知識以外,簡歷也是一個很重要的環節。一直很仰慕唐巧老師的猿題庫,無奈簡歷太差,都沒有收到面試邀請。後來好好改了簡歷以後,就沒有這種問題了。關於簡歷的書寫,推薦兩篇文章:如何寫面向網際網路公司的求職簡歷程式猿簡歷模板。沒有亮點,就當是拋磚引玉。

最後,當然是準備好相關崗位的基礎知識了。作為 iOS 開發者,雖然 Swift 已經發布了快兩年,但是大公司轉向 Swift 的動作還不明顯,所以 Objective-C 幾乎是必備項,Swift 都不一定能算是加分項。iOS 方面的知識也必不可少,雖然招聘資訊上寫著如果基礎紮實,零 iOS 基礎也可以,但是現實往往是比較殘酷的。

我的面試經歷

扯了這麼多,終於進入正題了,分享一下我的面試經歷。題目如下,破折線後面是簡單的解決思路

百度

一面:約1.5小時

首先是四個演算法題:

不用臨時變數怎麼實現 swap(a, b)——用加法或者異或都可以

二維有序陣列查詢數字——劍指 offer 第 3題

億級日誌中,查詢登陸次數最多的十個使用者——(不確定對不對,我的思路是)先用雜湊表儲存登陸次數和ID,然後用紅黑樹儲存最大的十個數。劍指 offer 第 30題

簡述排序演算法——快排,partion 函式的原理,堆排(不穩定),歸併排序,基數排序。

然後有一個智力題,沒完整的答出來,好像影響不是很大。

最後是 iOS 相關,面試官問的很開放,都是談談自己的理解:

說說你對 OC 中 load 方法和 initialize 方法的異同。——主要說一下執行時間,各自用途,沒實現子類的方法會不會呼叫父類的?

說說你對 block 的理解。—— 三種 block,棧上的自動複製到堆上,block 的屬性修飾符是 copy,迴圈引用的原理和解決方案。

說說你對 runtime 的理解。——主要是方法呼叫時如何查詢快取,如何找到方法,找不到方法時怎麼轉發,物件的記憶體佈局。

說說你對 MVC 和 MVVM 的理解。—— MVC 的 C 太臃腫,可以和 V 合併,變成 MVVM 中的 V,而 VM 用來將 M 轉化成 V 能用的資料。

說說 UITableView 的調優。——一方面是通過 instruments 檢查影響效能的地方,另一方面是估算高度並在 runloop 空閒時快取。

談談你對 ARC 的理解。ARC 是編譯器完成的,依靠引用計數,談談幾個屬性修飾符的記憶體管理策略,什麼情況下會記憶體洩露。

一面的問題非常基礎,主要是演算法和 Objective-C,因為準備比較充分,基本上答出來 80% 吧。大約一週後突然二面。

二面:約0.5小時

二面比較突然,顯示簡單的自我介紹,然後問了三個問題:

野指標是什麼,iOS 開發中什麼情況下會有野指標?——野指標是不為 nil,但是指向已經被釋放的記憶體的指標,不知道什麼時候會有,如果有知道的讀者還望提醒。

介紹 block。—— (接第一問) 我讓面試官提示我一下什麼時候會有野指標,他說用 block 時,我表示還是不知道,只知道 block 會有迴圈引用。於是就扯回了一面的問題。

說說你是怎麼優化 UITableView 的。——還是一面的問題。。。。。。。。。。。

雖然通過了,但是幾乎又問了一遍一面的問題讓我感覺對方不太認真。

三面:北京onsite,約2.5小時

首先是給一個小時,手寫演算法兩個演算法題。接下來問了 TCP 握手相關的。最後問了 OC 的一些細節問題。

網易

筆試

主要是計算機方面的大雜燴,涉及作業系統,網路,移動開發,演算法等。難度不大,目測是為了淘汰渾水摸魚的人,就不列出題目了,演算法有三題,直接線上寫(木有 IDE 表示很憂傷):

很長一道題,讀了很久才讀懂,目測是 DFS,但是最後沒時間了,寫了個思路。

把 "www.zhidao.baidu.com" 這樣的字串改成 "com/baidu/zhidao/www"。——老題目了,劍指 offer 的,兩次逆序排列即可。

求陣列中和為某個值的所有子陣列,比如陣列是 [5,5,10,2,3] 一共有四個子陣列的和是 15,比如 [5,10],[5,10],[10,2,3],[5,5,2,3]。這個就是簡單的遞迴了,分兩種情況,當前位置的數字在子陣列中,以及不在子陣列中。

一面

全部是 iOS 題,可能是覺得演算法已經面過了:

介紹 block。——我提到棧上的 block 在 ARC 下會自動複製到堆上,面試官問我從 iOS 4 還是 5 開始支援這一特性,表示不知道,我又不是學 OC 歷史的,後來想想可能是公司內部老專案有這個坑。

ARC 會對程式碼做什麼優化?——比如 NSString *s2 = s1; s2 = nil 這樣的語句,可能就不會有 retain 和 release方法了。

介紹一下 MVVM 和 RAC。——可能是我簡歷的某個角落寫了用過 RAC,被挖出來了,大概談了一下,結果面試官問我資料的雙向繫結怎麼做,bind 函數了解過麼,果斷說已經忘了

介紹自己用過哪些開源庫。——Masonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage

如果讓你寫,你能實現麼?——當然不能,不然還要實習?

讀過某個庫的原始碼麼?——扯了一點 SDWebImage,後來被告知這個庫用了 runloop 來保證滑動是載入資料的流暢性,自己看了原始碼後表示沒有發現,唯一用到 runloop 地方是保證後臺執行緒一直跑,也有可能是我理解錯了,如果錯誤歡迎指正。

SDWebImage 下載了圖片後為什麼要解碼?——當時矇住了,面試官很 nice 的解釋了一下,說是要把 png 檔案建立一個什麼記憶體對映,目前還不太懂,有空研究一下。

本來以為面的這麼差肯定是掛了,沒想到還是過了一面。過了不到一個小時,HR 電話打過來,約了兩天後二面。

二面

純數學和演算法:

下面這段程式碼的輸出結果是:

intmain() {inta[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

Objective-C 中的 copy 方法

runtime 中,SEL 和 IMP 的區別

autoreleasepool 的使用場景和原理

RunLoop 的實現原理和資料結構,什麼時候會用到

block 為什麼會有迴圈引用

使用 GCD 如何實現這個需求:A、B、C 三個任務併發,完成後執行任務 D。

NSOperation 和 GCD 的區別

CoreData 的使用,如何處理多執行緒問題

如何設計圖片快取?

有沒有自己設計過網路控制元件?

阿里二面

怎麼判斷某個 cell 是否顯示在螢幕上

程序和執行緒的區別

TCP 與 UDP 區別

TCP 流量控制

陣列和連結串列的區別

UIView 生命週期

如果頁面 A 跳轉到 頁面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪個先呼叫?

block 迴圈引用問題

ARC 的本質

RunLoop 的基本概念,它是怎麼休眠的?

Autoreleasepool 什麼時候釋放,在什麼場景下使用?

如何找到字串中第一個不重複的字元

雜湊表如何處理衝突

面試收貨

1.演算法題該怎麼答

面試官可能會問到你聞所未聞的演算法,這時候你不應該自己瞎想,而是先和麵試官把問題討論清楚。要知道,通過溝通弄明白複雜的問題也是一種能力,在和麵試官交流的過程中,不僅僅可以搞清楚題目真正的意思是什麼,還可以展現自己良好的交流溝通能力。所以千萬不要因為緊張或者害羞而浪費這次大好的機會。

有些題目似曾相識,但是暫時沒有思路。這時候不妨告訴面試官,給我一些時間思考這個題。然後不要急,不要慌,就當他不存在,拿出紙和筆慢慢算(這充分說明了面試戴耳機的重要性)。你一定要堅定一個信念:“任何一道稍微有難度的演算法題,除非做過,否則一定是需要時間想的”。所以,合理的安排思考時間吧。如果十幾分鍾都想不出來,可以直接放棄。

有時候面試官會要求線上程式設計,相信我,他不會無聊到盯著你的程式碼看的,面試官一般都很忙,他也有自己的工作要完成,所以你就當是用自己的 IDE 就好。線上程式設計往往是一箇中等難度的問題,所以不要自己嚇唬自己。同時要注意程式碼格式的規範,適當的註釋,提前編寫好測試用例等,即使沒有解決問題,也至少要把自己良好的程式設計習慣展示給面試官。

2.遇到不會的問題怎麼處理

這個問題有可能是面試官故意說得含糊不清,考察你的交流能力,也有可能是無意的,或者是你的理解方式出現了偏差。不管是以上哪種問題,你都應該先和麵試官交流,直到你搞懂了面試官要問你什麼,而不是按照自己的理解說了一堆無用的東西。

舉個例子,面試官可能會問了一道演算法題:“如何判斷兩個無限長度的連結串列是否有交點?”。對於“無限長度”可以有不同的理解,如果真的是有無窮多個節點,那顯然這個問題是無法解決的。但如果連結串列僅僅是有環,那麼還是可以解決的。如果面試官的本意是連結串列有環,但你錯誤的理解成了無窮多個節點,那麼必然會導致無法回答這個問題。而且這並非能力不足,而是屬於交流溝通方面的失誤,這也正是我想分享的“技巧”。

還有一些問題,雖然你沒有接觸過,但是由於對類似的問題或者情況有過思考,所以可以合理假設。比如面試官問 “ARC 會對程式碼做什麼樣的優化?”。我們知道 ARC 的本質就是在合適的地方插入 retain 和 release 等方法,那麼就應該從這個角度出發去思考問題。

顯然分別執行 retain 和 release 操作是沒有必要的,那麼就可以構造出相應的例子:

NSString*s1 [email protected]"hello";NSString*s2 = s1;NSString*s2 =nil;

由於這種問題我們沒有真正實踐過,所以可以委婉的告訴面試官:“根據我的推理,可能會有……”。

3.遇到真心不會的問題怎麼處理

遇到不會的問題果斷承認啊。如果是基本問題,比如問你雜湊表怎麼實現,你說不會,那麼這次面試可能就懸了。如果是有一定難度的問題,那麼你承認不會,也是一種明智之舉,畢竟人無完人,一個問題不會並不能全盤否定一個人的能力。

但是比較糟糕的一種情況是,面試者由於過分緊張,擔心答不上面試官的問題會有嚴重後果,所以嘗試著去敷衍面試官。比如:“我猜是 xxx 吧”,“我覺得可能是 ……”,更有甚者直接裝逼:“這個我試過,不就是 xxx 麼”。要知道,此時的你,由於緊張,在心態上已經輸給了面試官,更何況面試官問你的問題一定是他有把握的,你覺得這時候你負隅頑抗會有幾成勝算呢?

所以,面試官問我“堆排序”的細節時,由於我當時忘了堆排序是怎麼實現的,所以我直接告訴他我記不清了。另一個主動認輸的例子是面試官問我 RAC 如何實現雙向繫結,我告訴他這個是我當時學習的時候寫過的 demo,因為不常用,已經只記得一些簡單的概念了。

最後,還需要保持一個平穩的心態:“面試時盡力就好,遇到自己不會的問題也是正常情況”。如果面試者順利答對了所有問題,難免會讓面試官感到一絲尷尬,面試者也有可能會產生一些別的情緒。所以,我們要做的只是把自己的能力展示給面試官,做到不驕不躁。

4.準備殺手鐗

除了能夠回答上面試官的問題以外,我建議自己準備一兩個殺手鐗級別的話題。所謂的殺手鐗,至少具備以下幾個特徵:

你親自動手試驗過。所謂實踐是檢驗真理的唯一標準,資料是不會說謊的。

問題有足夠的深度。一面的面試官可能是你的直接上司,二面一般就是更改級別的。你的深度一定要遠超其他面試者,讓一面面試官覺得自己沒有十足把握,讓二面面試官覺得這是一個好話題,自己的手下都不一定能有這麼獨到深刻的見解。

你對這個問題理解的足夠深入,無論是廣度還是深度都達到一定水平。

5.心態

通常情況下,面試結果都會在 1 - 3 天內知道。有的面試官會當場告訴你通過了,有的公司面試結束後幾個小時就能出結果。

但有些時候,由於某些原因(我也不清楚。。。。可能是比較忙?),你遲遲無法獲知面試結果。這時候你可以選擇耐心等待,獲知直接給 HR or 內推者傳送郵件。一般來說面試結束後三天還沒收到通知,你可以傳送郵件詢問或者再等等。最後祝願每一位同學都能拿到自己想去公司的Offer,

作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要這是一個我的iOS交流群:638302184,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!

文章來源於網路,如有侵權,請聯絡小編刪除。