作者 | Ashwin Goel
譯者 | 彎月,責編 | 屠敏
出處:聊聊Python
01
我将履歷(包括我的所有項目、成就和經驗)發給了微軟的15-20個人,希望至少能有一位可以推薦我參加線上程式設計測試。
重點:
勇敢地和陌生人聯系,這隻是建構關系網的一種方式。你擁有的關系網越強大,就越容易找到工作。
在與某人聯系時,不要簡單地打招呼并要求對方做推薦人,你可以寫一封信詳細介紹你的項目、經驗、成就,并寫出他們推薦你的理由。
郵件剛發出去1-2個小時,我就收到了微軟的第一輪面試邀請,這是一次純粹的程式設計測試。
02
2019年9月22日,我參加了第一輪面試。
我拿到了三個解決問題的題目,而且給出的時間也夠。
其中一個問題是:
給定大小為n的數組,請以偶數和奇數交替的方式升序排序數組。
注:這是最簡單的一道題。
在面試僅剩5分鐘的時候,我的筆記本電腦崩潰了。這可能是最糟糕的情況了,但很幸運的是,過了一會兒後我可以繼續測試了。
我寫出了三道題的代碼,并通過了所有測試用例,包括邊界情況和複雜的測試用例。
我對第一輪面試充滿了信心,并熱切期待結果。
03
10月11日,結果宣布了,我成功地進入了第二輪面試。
第二輪面試應該是視訊面試,我認為面試主要是資料結構,是以就開始為此做準備。
這次面試定在了10月14日。首先簡單地做了介紹,然後面試官開始測試OOPS的概念。我很高興,因為從大學開始我就不需要為這個話題發愁了,因為我很早就搞清楚了這個概念。
他們問了我有關繼承的一些概念,例如多态性、方法重載和方法重寫之間的差別、virtual關鍵字和抽象。
重點:
如果你不了解某個概念,那也不要給出不相關的答案,乖乖承認就好。然後詢問更多有用的資訊。這可以表明你願意學習新事物,給面試官留下好印象。我并不了解virtual關鍵字,但我沒有給模糊的答案,而是告訴他我沒聽說過,後來我們就這個問題讨論了2-3分鐘。
面試的第二部分是解決問題。他們的主要目的是測試我們思路以及解決新問題的方法。是以,說出你的思路非常重要。
我拿到的問題如下:
假設有一個3維數組,且按照如下螺旋方式排序:
01 02 03 04
12 13 14 05
11 16 15 06
10 09 08 07
請問,從這類數組中搜尋某個數字的最佳方法是什麼?
起初,我沒有想到好的解決方案,是以我提出了最差的解決方案(O(n²)),然後開始考慮優化解決方案。
我一邊想,一邊說出了我的方法,是以面試官也給予了我幫助,并給了我很明顯的提示,最後我找到了正确的方法。
說出你的思路。讓面試官知道你在想什麼,他可能會引導你朝正确的方向思考。
跟面試官提出問題,進一步闡明問題。
從最糟糕的解決方案開始,然後開始對其進行優化。
無論你提出怎樣的解決方案,他們都希望你寫出代碼,是以需要為此做好準備。
注:我開始想到的解決方案非常複雜O(n²),最後優化到了O(log(n)),我心中的喜悅難以用文字描述。
對于這輪面試,我也非常樂觀,而且很幸運,我接到了下一輪的複試。
04
11月17日,我在學期末考試期間抽空來到了微軟的班加羅爾辦事處,因為我不想錯過這個大好的機會。
老實說,他們的園區是一個理想的工作場所。真的很棒!
由于我提前到了,是以一直在前台等候,一邊研究GeeksforGeeks上常見的資料結構問題。
很快我們就被帶到了會議室,并得知我們這20名學生是從1萬1千名線上申請人中篩選出來的,頓時讓我感覺良好。
在簡單的介紹開始後,面試正式開始。
第一回合
本回合主要是看履歷。面試官說他們真的很喜歡我的履歷。他們詢問了我有關項目的問題,并了解了我以前做過的工作。
1、你必須熟知履歷中的每個詞。
2、不要寫任何你不是十厘清楚的東西。
很快他們就開始測試我的思維能力,并提出了兩個常見的資料結構問題。
其中一個問題是如何反轉連結清單。前一天晚上乘坐公共汽車的時候,我剛剛在GeeksforGeeks上閱讀了有關這個問題的文章,而且我記得部分解決方案。經過一番思考後,我向他們解釋了算法。他們還讓我們用C++寫出正确的代碼,還通過示例進行了測試。
注:微軟追求完美,每個面試官都表現出了這一點。每個算法和代碼都需要通過測試用例驗證正确性。
另一個問題是,假設你有一個改進的連結清單,連結清單中的每個節點除了正常的資料變量和指向下一個節點的指針之外,還有另外一個指針,可能指向連結清單的任何一個節點。現在你的任務是克隆這個資料結構。

在上圖中,每個節點都有一個指向下一個節點的指針,一個資料項(即Node1,Node2…Node5),以及一個指向任意随機節點的随機指針。
我發現這個問題很棘手,需要一些思考。
第二回合
本回合主要是測試更深的程式設計技巧和更快的思維。
我拿到了兩個問題:
1、編寫代碼,檢查二叉樹的高度。
2、編寫代碼,檢查二叉樹是否是二叉搜尋樹。
我寫出了兩道題的代碼,但不得不多花點時間調試一些小錯誤。
這兩個問題都需要利用遞歸來解決。
寫完代碼後,還有非常重要的一步:驗證!
第三回合
這是最後一回合,面試官是微軟的一位進階專業工程師,他已經在微軟工作了8年。面試開始的時候,他首先問了一些關于我的履歷的問題。他對我做過的一個項目IGBTQ CPU排程算法很感興趣。我在白闆上向他解釋了這個項目。
下半場是解決問題。他給我的問題是:
考慮一個從1到n的數字序列。
接下來,在疊代(i)時,我們删除第(i + 1)項。
例如:
考慮 n = 20
疊代1:删除第二個元素
1 3 5 7 9 11 13 15 17 19
疊代2:删除第3個元素
1 3 7 9 13 15 19
疊代3:删除第4個元素
1 3 9 13 15
以此類推……
最後剩下來的數字稱為幸運數字。
任務是檢查給定的數字“ n”是不是幸運數字。
在經過反複思考後,我說出了解決方案,并得到了面試官的回報,然後我根據回報找到了解決方案的模式,并寫出了代碼。
接下來是一些常見的問題,有關我個人以及我想從事的工作。
- 你需要清楚為什麼想進這個公司。你需要對他們的産品和計劃進行足夠的研究,并清楚地了解你的動機以及為什麼想在這裡工作。
- 在面試前,你需要準備明确而清晰的答案:為什麼你想進這個公司,而為什麼這家公司應該雇傭你。
- 不要說“我有信心”或“我正在努力”之類的話!具體說明你的答案,并舉例證明你的觀點。
05
最後,我想說這是有史以來最好的面試經曆之一。我曾接受過多家頂級公司的面試,但以前從未感覺自己和面試官和面試過程如此親近。别的公司可能會測試你的知識,并期望獲得行業水準的答案,但微軟更注重你的思維過程和程式設計技巧。我在整個過程中就感受到了這一點。
另外,我沒有被錄用。我想在本文最後說明這一點,因為對于我們這個年齡的人來說,最重要的是學習經驗以及提升自我。我們的職業生涯才剛剛起步,被拒、薪水和便利性沒那麼重要。但是,我為什麼被拒仍然是一個謎,我本人毫無頭緒。我感覺面試非常順利,本來也以為會有好結果。
然而,我失去的隻是暫時的,但我獲得的卻是永久而無價的。
原文連結