实习生面试相关-b
面試要準備什么
有一位小伙伴面試阿里被拒后,面試官給出了這樣的評價:“……計算機基礎,以及編程基礎能力上都有所欠缺……”。但這種籠統的回答并非是我們希望的答案,所謂的基礎到底指的是什么?
作為一名 iOS 開發者,我所理解的基礎是 操作系統、網絡和算法這三大塊,不同的開發方向可能有不同的側重,但基礎總的來說就是這些。我不推薦通過去網上看教程來學習這些基礎知識,因為能用短短幾篇文章講明白的事情不叫基礎,至少我沒見過寫得這么深入淺出的文章。
不知道有多少讀者和我一樣有過這樣的困擾:“我知道某些東西很重要,所以去百度查了資料,但是查到的文章質量很差,正確率沒有保證”。這其實是正常的,優秀的文章一般都放在優秀的作者的個人博客上,這恰恰是搜索引擎的盲區,所以一般只能搜到 CSDN、博客園這種地方的文章。自然就無法保證文章質量。
出于這種考慮,我在文章最后的復習資料中,提供了用于學習相關基礎知識的書籍,如果您恰好是 iOS 開發者,還可以閱讀我收集的一些高質量文章,正確性比較有保證(我寫的除外)。
除了準備通用的基礎知識以外,簡歷也是一個很重要的環節。一直很仰慕唐巧老師的猿題庫,無奈簡歷太差,都沒有收到面試邀請。后來好好改了簡歷以后,就沒有這種問題了。關于簡歷的書寫,推薦兩篇文章:如何寫面向互聯網公司的求職簡歷、程序猿簡歷模板。你也可以參考我的簡歷,沒有亮點,就當是拋磚引玉。
最后,當然是準備好相關崗位的基礎知識了。作為 iOS 開發者,雖然 Swift 已經發布了快兩年,但是大公司轉向 Swift 的動作還不明顯,所以 Objective-C 幾乎是必備項,Swift 都不一定能算是加分項。iOS 方面的知識也必不可少,雖然招聘信息上寫著如果基礎扎實,零 iOS 基礎也可以,但是現實往往是比較殘酷的。
我的面試經歷
扯了這么多,終于進入正題了,分享一下我的面試經歷。題目如下,破折線后面是簡單的解決思路。
百度
一面:約 1.5 小時
首先是四個算法題:
然后有一個智力題,沒完整的答出來,好像影響不是很大。
最后是 iOS 相關,面試官問的很開放,都是談談自己的理解:
一面的問題非常基礎,主要是算法和 Objective-C,因為準備比較充分,基本上答出來 80% 吧。大約一周后突然二面。
二面:約 0.5 小時
二面比較突然,顯示簡單的自我介紹,然后問了三個問題:
雖然通過了,但是幾乎又問了一遍一面的問題讓我感覺對方不太認真。
三面:北京 onsite,約 2.5 小時
首先是給一個小時,手寫算法兩個算法題。接下來問了 TCP 握手相關的。最后問了 OC 的一些細節問題。
網易
筆試
主要是計算機方面的大雜燴,涉及操作系統,網絡,移動開發,算法等。難度不大,目測是為了淘汰渾水摸魚的人,就不列出題目了,算法有三題,直接在線寫(木有 IDE 表示很憂傷):
一面
全部是 iOS 題,可能是覺得算法已經面過了:
本來以為面的這么差肯定是掛了,沒想到還是過了一面。過了不到一個小時,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 * 類型。
然后好像沒結果了,可能是編程實現太渣了?
其他我知道的面試題
阿里一面:
阿里二面:
面試收獲
1. 算法題怎么答
面試官可能會問到你聞所未聞的算法,這時候你不應該自己瞎想,而是先和面試官把問題討論清楚。要知道,通過溝通弄明白復雜的問題也是一種能力,在和面試官交流的過程中,不僅僅可以搞清楚題目真正的意思是什么,還可以展現自己良好的交流溝通能力。所以千萬不要因為緊張或者害羞而浪費這次大好的機會。
有些題目似曾相識,但是暫時沒有思路。這時候不妨告訴面試官,給我一些時間思考這個題。然后不要急,不要慌,就當他不存在,拿出紙和筆慢慢算(這充分說明了面試戴耳機的重要性)。你一定要堅定一個信念:“任何一道稍微有難度的算法題,除非做過,否則一定是需要時間想的”。所以,合理的安排思考時間吧。如果十幾分鐘都想不出來,可以直接放棄。
有時候面試官會要求在線編程,相信我,他不會無聊到盯著你的代碼看的,面試官一般都很忙,他也有自己的工作要完成,所以你就當是用自己的 IDE 就好。在線編程往往是一個中等難度的問題,所以不要自己嚇唬自己。同時要注意代碼格式的規范,適當的注釋,提前編寫好測試用例等,即使沒有解決問題,也至少要把自己良好的編程習慣展示給面試官。
2. 遇到不會的問題怎么處理
這個問題有可能是面試官故意說得含糊不清,考察你的交流能力,也有可能是無意的,或者是你的理解方式出現了偏差。不管是以上哪種問題,你都應該先和面試官交流,直到你搞懂了面試官要問你什么,而不是按照自己的理解說了一堆無用的東西。
舉個例子,面試官可能會問了一道算法題:“如何判斷兩個無限長度的鏈表是否有交點?”。對于“無限長度”可以有不同的理解,如果真的是有無窮多個節點,那顯然這個問題是無法解決的。但如果鏈表僅僅是有環,那么還是可以解決的。如果面試官的本意是鏈表有環,但你錯誤的理解成了無窮多個節點,那么必然會導致無法回答這個問題。而且這并非能力不足,而是屬于交流溝通方面的失誤,這也正是我想分享的“技巧”。
還有一些問題,雖然你沒有接觸過,但是由于對類似的問題或者情況有過思考,所以可以合理假設。比如面試官問 “ARC 會對代碼做什么樣的優化?”。我們知道 ARC 的本質就是在合適的地方插入 retain 和 release 等方法,那么就應該從這個角度出發去思考問題。
顯然分別執行 retain 和 release 操作是沒有必要的,那么就可以構造出相應的例子:
NSString *s1 = @"hello"; NSString *s2 = s1; NSString *s2 = nil;由于這種問題我們沒有真正實踐過,所以可以委婉的告訴面試官:“根據我的推理,可能會有……”。
3. 遇到真的不會的問題怎么處理
遇到不會的問題果斷承認啊。如果是基本問題,比如問你哈希表怎么實現,你說不會,那么這次面試可能就懸了。如果是有一定難度的問題,那么你承認不會,也是一種明智之舉,畢竟人無完人,一個問題不會并不能全盤否定一個人的能力。
但是比較糟糕的一種情況是,面試者由于過分緊張,擔心答不上面試官的問題會有嚴重后果,所以嘗試著去敷衍面試官。比如:“我猜是 xxx 吧”,“我覺得可能是 ……”,更有甚者直接裝逼:“這個我試過,不就是 xxx 么”。要知道,此時的你,由于緊張,在心態上已經輸給了面試官,更何況面試官問你的問題一定是他有把握的,你覺得這時候你負隅頑抗會有幾成勝算呢?
所以,面試官問我“堆排序”的細節時,由于我當時忘了堆排序是怎么實現的,所以我直接告訴他我記不清了。另一個主動認輸的例子是面試官問我 RAC 如何實現雙向綁定,我告訴他這個是我當時學習的時候寫過的 demo,因為不常用,已經只記得一些簡單的概念了。
最后,還需要保持一個平穩的心態:“面試時盡力就好,遇到自己不會的問題也是正常情況”。如果面試者順利答對了所有問題,難免會讓面試官感到一絲尷尬,面試者也有可能會產生一些別的情緒。所以,我們要做的只是把自己的能力展示給面試官,做到不驕不躁。
4. 準備殺手锏
除了能夠回答上面試官的問題以外,我建議自己準備一兩個殺手锏級別的話題。所謂的殺手锏,至少具備以下幾個特征:
- 你親自動手試驗過。所謂實踐是檢驗真理的唯一標準,數據是不會說謊的。
- 問題有足夠的深度。一面的面試官可能是你的直接上司,二面一般就是更改級別的。你的深度一定要遠超其他面試者,讓一面面試官覺得自己沒有十足把握,讓二面面試官覺得這是一個好話題,自己的手下都不一定能有這么獨到深刻的見解。
- 你對這個問題理解的足夠深入,無論是廣度還是深度都達到一定水平。
以 iOS 中的 UITableView 的調優為例,我自認為對它有一定的理解,同為 iOS 開發者的讀者可以閱讀這篇文章:UIKit性能調優實戰講解,同時我還仔細研究了 sunnyxx 大神的 優化UITableViewCell高度計算的那些事。
這一類的話題通常需要仔細研究官方文檔,iOS 開發者還可以觀看 WWDC 視頻,然后花上充足的時間去總結。比如我寫 iOS自定義轉場動畫實戰講解 這篇文章就花了至少三天時間,包括大年初一一整天。
由于此類話題數量不多,所以準備一個或數個即可,面試時可以有意識的將面試官引導到這些話題上去,從而充分的展示自己。
5. 心態
通常情況下,面試結果都會在 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
首先兩本必備的神書一定是要讀完的。一本是講 OC 的《Effective Objective-C 2.0》,中文名叫:“編寫高質量 iOS 與 OS X 代碼的 52 個有效方法”。另一本書叫:《Objective-C 高級編程》。前者講解 OC 中各種細節,后者主要講了 ARC、Block 和 GCD。
光是讀書,思考不夠,很容易在面試時被問懵逼,所以建議一遍嘗試回答面試真題,一邊閱讀以下總結性的文章,重要性不分先后:
強烈推薦第八篇文章,做完這上面的題目基本上可以應付大多數 OC 方面的問題了。
iOS 開發
其中需要重點了解 runloop,它不僅僅是簡單的“跑圈”的 概念,很多問題其實都與它有關,建議認真閱讀 ibireme 大神的總結
其他面經
原文鏈接:http://www.jianshu.com/p/ee15c1cf9c16
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。
總結
- 上一篇: java开源社交新零售_企业为什么要向社
- 下一篇: 常见随机过程(一)(备份草稿)