我是在承德路那邊面試的
剛報到後就被帶到一間小會議室
簡單的填了基本資料表後
等了10幾分鐘就開始面試了
==============================================================================
第一關:
首先是請我自我介紹一下
之後就是問履歷中有寫到的一些事情
或是根據做過的project或專題來問實作方法等細節
接下來就是開始連續問各種專業問題了
1. process 和 thread 的差異?
2. Mutex 和 semaphore 的差異?mutex 如何實作?
3. TCP 和 UDP 的差異?
4. TCP 的傳輸機制和 ACK 是如何運作的?
5. 有沒有寫過 multi-threaded 的程式?對 multi-threaded 的概念了解程度如何?
6. process 的排程方法的種類和運作方式?
7. shared memory 是如何實作的?
8. 要計算 set A - set B 的話,要用什麼資料結構?時間和空間複雜度為何?
有更好的方法嗎?
再來則是考白板程式題
1. 寫一個用來 reverse linked list 的函式
這一題應該算是偏簡單的考驗指標用法的linked list題
個人是用3個指標對list從頭到尾處理一次就完成了
寫完後先在腦內帶入幾個小測資確定一下有沒有bug
之後換面試官人腦compile和驗證後
面試官就請我稍等一下後出去了
在等待第二關開始的空閒時間
我有試著稍微回想一下剛剛被問到的題目和自己的表現
可能是因為第一次面試所以表現得有點緊張
有幾題明明我其實應該是知道要如何回答的
但是當下卻突然想不太出來或是回答錯誤
讓我感到有點懊惱
所以第一關我個人是覺得表現得差強人意而已XD
==============================================================================
第二關:
首先一樣是自我介紹一下
再來也是問履歷或是做過的專題或project
然後又是專業問題時間
1. 如果是我會如何去實作 mutex?
2. process 和 thread 的差異?
3. socket programming 的運作機制?
4. TCP 的 3-way handshaking 機制?
5. 介紹 OOP 的概念 (繼承和多型)
6. static 放在不同位置所代表的意義?
7. Majority Element:假設現在有一個 integer array,裡面有一個 integer 出現次數
超過1/2,請問該如何找出這個integer?此方法的時間和空間複
雜度為何?
再來則是考白板程式題
1. 寫一個可以判斷 linked list 中是否有 cycle 的函式
可以用俗稱「龜兔賽跑」的方法去實作
也就是用2個指標:一個一次走一步、另一個一次走兩步
如果撞到的話就代表有cycle
走到NULL的話就代表沒有cycle
2. 寫一個可以找出 binary tree 從 root 到 leaf 的最短路徑的函式
直接用BFS應該就可以輕鬆解決了
面試官看了看沒什麼問題後
就直接送我出去結束第一天的面試
回到家午睡途中就接到人資來電約二面時間
==============================================================================
第三關(偽):
進來的是人資姊姊
大概問了一些非專業上的問題
像是為什麼要來面試群暉之類的
還有就是興趣或其他人格特質的問題
可能是想要看回答和反應來判斷我的個性之類的 (?
反正就都照實回答就好了
所以其實沒什麼壓力XD
==============================================================================
第三關(真):
首先一樣還是自我介紹
再來也是介紹一下做過的專題或project
之後是短暫的問題時間
1. process 的 schedule 方法介紹?如果是你會使用哪一種?
2. 說說看你修過的所有課中,那些課讓你覺得很有趣或是印象深刻?
不過既然問題問比較少
那可想而知主力應該都放在白板程式題了
1. 給定遞迴式:a_n = 3 * a_(n-1) - 2 * a_(n-2), a_0 = 1, a_1 = 2,
寫一個回傳 a_n 的函式
一開始我很制式的用DP的方法去算出答案
但是面試官就問我有沒有更好的方法呢
後來稍微觀察一下 a_n 的規律就發現 a_n = 2^n
所以其實可以很直接的就回傳答案
2. 給定一數字 N,寫一個函式去找出並回傳相加後等於 N 的「長度 L 的連續數字」
最直觀的答案就是「從 N 開始的長度 1 的連續數字」
不過這一題答案不只一種
通式的話應該是寫成如果 N 被奇數 M 整除的話
就會有「以 N/M 為中心的長度為 M 的連續數字」這個答案 (M=1時就是最直觀的答案)
也有「以 (M-1)/2 和 (M-1)/2 + 1 為中心的長度為 (N/M)*2 的連續數字」這個答案
這一題一開始其實我是沒什麼頭緒
後來經過面試官稍微提示才慢慢找出所有可能的答案
PS. 有點忘了當初的答案了,這題答案不太確定是不是這樣寫XD
3. 寫一個對 matrix 旋轉 90 度的函式
可以用2個for迴圈去一次旋轉4個elements
只要稍微注意邊界條件和各elements的位置
這題應該就可以輕鬆解決
==============================================================================
第四關:
終於到傳說中的主管關
主管就問我有沒有什麼東西想問的
我就問了公司有哪些team之類的問題
之後主管看了我基本資料表寫的期望薪資就說可以給我這個價錢
然後說等等要開會所以就這樣直接結束面試吧
結果:offer get
==============================================================================
總結:
之前有些心得文說面試經驗不怎麼愉快
不過可能我運氣比較好
遇到的面試官們都很和善
遇到不會的白板題也會適時給予提示或引導思考的方向
在我回答問題時也會認真的邊聽邊作筆記 (應該是記錄我對這方面的熟悉度之類的)
整體來說面試的感覺頗不錯
==============================================================================
準備方向建議:
1. 資料結構:
不需要會什麼太高深的資料結構
只要能清楚理解基本的資料結構就好了
像是linked list、tree、stack、heap、queue、hash
尤其是linked list、tree、stack更是一定要熟悉各自的用法和優缺點
2. 演算法:
如果以前有修過相關課程的話
還是建議拿出來重新翻一下
雖然我其實只有被考到很簡單的幾個演算法
但是之前的其他心得文好像有些會被考到稍微深入一點的概念
所以還是念一下會比較保險
3. 作業系統:
主要考的部分還是process和thread的相關概念
但是偶爾也會考到其他部分
像是我就被問到排程的相關問題
基本上還是建議把課程投影片拿出來複習一遍
如果時間不夠的話也可以只全力複習重點
4. 計算機網路:
之前沒看過有心得文提到會考到計網相關的部分
不過我還被考到蠻多題的
所以保險起見可能也是要複習一下
範圍看起來主要是圍繞著TCP和UDP
所以一樣時間不夠可以只重點複習TCP和UDP的部分
5. 物件導向程式觀念:
完全沒學過的話一定要好好惡補
之前學過的話大概就稍微複習一下多型和繼承就好了
其他部分只靠平常的印象應該也可以輕鬆應付
6. coding
這部分主要還是要靠平常累積下來的基礎
而面試前複習的話則是靠LeetCode
我個人是因為還算喜歡寫這種解題型的程式
所以當初一面前的一個禮拜就開始寫
總共寫了90幾題左右
一面和二面之間的空檔又再多寫了30幾題
不過其實我覺得頂多只需要把easy的題目都寫完就好了 (剛剛數了一下大概67題)
如果能不看Discussion就把easy全部解決
我是覺得白板程式題部分應該真的很穩了XD
當然如果時間不夠的話也可以只在看起來會考的tag中各選幾題來寫就好了
因為大部分人應該已經很久沒有寫這種解題型的程式了
所以一定要至少寫個幾題找回手感和解題的sense
不然我覺得到時候很容易會在白板上犯一些小bug或少考慮到邊界條件等
而且寫code其實也算是順便複習到資料結構和演算法
==============================================================================
不知不覺寫了好長一大串
有想到什麼的話我再補充吧XD