Google、Facebook、Rocket fuel面試經驗總結

紫鳳發表於2013-10-21

(未名空間站)找工作期間在本版潛水兩個月,收益良多,發一下最近面經和經驗作為回饋。

本人背景:美國不錯學校電子PHD即將畢業,專業是EDA做電路設計演算法優化。因為EDA已經是一個很穩定的工業,沒什麼太大的前景,隨想轉到前沿的tech公司。本專業只投了一家現在最大的公司,拿到offer。別的投了Google, Facebook, Rocket fuel, Twitter, Linkedin, Yahoo, Amazon, Box, Oracle. 除了box別的都找人refer了, 在此感謝板上大哥們的熱情幫忙. 除了GFR別的都沒理我,可能背景差太大了。

因為之前是學演算法的,mit演算法書以前就看過兩遍,基礎還可以,前期8月份刷了遍leetcode。然後9月初投出簡歷。兩個星期刷Career cup 150, 最後面試期間一直查缺補漏。到現在塵埃落定大概兩個月。 最後GFR全掛,總結下慘痛經歷:

  1. Facebook電面

面試官做distributed cache infrastructure的,先問我最難的project,沒怎麼好好準備過behavior,胡亂說了一通。但是因為做的是電路相關,非行內人士很難明白,講的也比較亂。最後估計起到了反效果。感覺如果不是有特別好的經歷和體會的話(特別對於fresh在校內沒什麼好相關專案經歷的)這種最好長話短說想辦法一筆帶過,不然可能起到反效果。

浪費了大幾分鐘開始第一題,leetcode原題,Valid Panlindrome "A man, a plan, a canal: Panama" is a palindrome.

這題之前做過,也很簡單,但當時太緊張出了一個很sb的bug,還是在面試官提示下找到的。15行的程式碼出bug實在是不能犯的錯誤。另外在判斷一個char是否letter的時候沒有另用函式把一堆&&寫了兩次,被批評不夠簡潔。

第二題,將1->2->3->4->5->6->7 變成 1->7->2->6->3->5->4,不能用額外空間第一遍用了recursive很快解決,被指出用了stack額外空間,開始改iterative,最後因為第一題浪費時間手忙腳亂沒改完。說了一下大概思路草草收場,面完就知道不妙。4天后被通知掛了。

總結: facebook非常重視coding的clean和bugfree。 這兩題都沒什麼演算法但是如果coding不過硬第一遍很容易有bug,我感覺從這點上來講面試官出題水品很高,死的心服口服。 另外他家感覺比較看背景,phd onsite會有jedi面試問專案經驗什麼的,專業差太大估計要超級牛才容易過。

  1. Google電面

上來直接上題,題目有些繞。CSS裡面表示顏色用#abcdef (eg 0x1F2A3B) 這種形式, 每個字母代表四個bit (hex),兩個字母代表一種原色比如 ab = R, cd = G, ef = B現在需要壓縮空間改#abcdef 為 #xyz實際上#xyz = #xxyyzz,所以減小一半,問怎麼找到最好的壓縮讓(ab-xx)^2 + (cd - yy)^2 + (ef - z)^2 最小

這題其實數學上很簡單因為三個維度是分開的,其實就是找#ab到#xx的壓縮。

我當時的面試官是個asian可能是韓國人或abc,有點bitchy。我最開始說讓我想一想,才過了5秒鐘他說不知道我在想什麼讓我在google doc上打,然後我就在上面打example試圖觀察一下規律,他又阻止我說不用什麼都打出來。

完了我說了我的觀察: a的權重更大, x應該很接近a, 實際上 x = a, a - 1 , or a + 1。 然後他不置可否。可能我說的不是很清楚,他又開始和我糾結我的變數名用得不好。因為他一直和我糾結這些細節,我也沒法安心思考,直接就開始寫code,又拿不準函式input和output應該用什麼樣的type和形式。這就是這種模糊提很麻煩的一個地方。面試官還是不給提示,我就開始寫但是code寫的很亂。中途面試官沒有任何提示。

完了我說想move on到下一題他說沒時間了要我找bug。整個code寫的很糟,因為沒有分情況按 a > b 時 x = a, a- 1, a < b時 x = a, a + 1這樣來考慮所以變成了for loop非常亂。還剩5分鐘時萬念俱灰面試官問我還可以怎麼optimize已經沒心思回答了跟他說”如果你想讓我檢查程式碼我就看吧“開始有點頂撞他的意思。我電面這麼多次第一次和麵試官搞得這麼僵心情非常沮喪。最後草草收尾。3天后通知被掛。

心得體會:google電面其實是很鬆的,很容易過。電面沒過打擊很大,除了運氣不好碰到面試經驗不豐富的面試官和模糊題外主要問題還在自己。因為題目並不難,就算和麵試官不和拍也應該避免干擾仔細思考認真寫程式碼。特別是到後面十分鐘我有點破罐子破摔,這樣給面試官映像肯定非常糟糕。因為面試的一個目的就是考驗你是rise against challenge還是crash under pressure。這點上我表現的非常失敗。因為google家比較看中演算法算是我的強項,所以沒能去成onsite非常可惜。

  1. Rocket Fuel

網上交簡歷,當天收到hr回信,過兩天和hr電話chat半個小時,主要問問背景和看你是不是seriousapplicant。完了發來online test 5hour。我做的auto racer。沒有follow他的hints選了最優演算法但是由於編不出balanced avl tree有個test case沒過,還是個給了電面,面試官是三哥,電面是之前有人貼過的ad query題,給出了大家討論的最優答案,又擴充到分散式系統。才說了半個小時面試官突然說時間到了問我有沒什麼問題,我看他很急就說沒問題就bye了。本來以為肯定掛了因為預定要一個小時,結果過了兩天recruiter說feedback very positive讓我去onsite有點莫名其妙。

onsite中午和一個cmu畢業的topcoder 2000+的nb phd吃飯閒聊了一下,下午面了四個人,三個三哥一個asian。兩個big data infrastucture(最後端)的, 兩個servinginfrastrucre(中後端)的。所有題目在之前rocket fuel的帖子裡或者leetcode都能找到,除了一道挺有意思的題

給定一個n*n的board裡面是0或1.算出裡面獨立0group的數量。比如

0 0 1 1 1

0 1 1 1 0

1 1 1 1 0

1 0 1 1 1

1 1 1 1 1

答案是3個group。我瞬間給出了一個BFS的O(n^2)答案,被指出需要visited陣列的額外空間。然後給了一個逐行掃描的演算法相當tricky,我經過提示才想出來。面試完後第二天被告知掛了。其實自我感覺還不錯除了java multithreading答的不好。recruiter給的反饋是總體還不錯但有人指出我coding a bit messy。說另外還有一個不錯的candidate選了另外那個人,說我是pretty close。我自己猜測如果不是因為另外一個人是三哥或美國人這種原因還是死在coding quality上,另外背景實在差的有點遠。他家要求最好一遍寫出clean code。另外在onsite是建議code不要寫太長,如果要超過一黑板最好把裡面主要部件都先用函式代替寫出主要流程向面試官說明之後補充即可。

心得: onsite時因為很多題都見過經常迅速講一下思路就開始coding,感覺交流不夠。面試的時候交流還是第一位的,如果跑上來就寫程式碼寫的再好面試官對你印象也未必好(可能還會覺得你是練過的),因為他會把你當成未來的coworker所以交流的融洽是很重要的。rf家的big data infrastructure全部是三哥,我覺得這也是我掛的一個原因,建議申請ai optimization那些核心組,那才是他們家的精髓所在。rf沒有之前提的那些帖子那麼亂但感覺還是不夠正規,面試的時候不是很舒服,連schedule都不給你,說好的面試官經常換人。

總體心得:coding不過硬會導致必然的失敗。我之前就是覺得自己演算法底子不錯忽視了coding,其實本末倒置。工作中coding才是最重要的,而且看了很多牛人的coding之後才發現這個事情真的不是搬磚那麼簡單, 同一個內容的程式coding好不好能差很多(再加上clear和readability的考慮)。頂尖it公司要的不是average coder而是top coder,所以以前仗著演算法不錯就滿足於average的coding水品實在是很幼稚,以後一定會在這方面加強鍛鍊。

個人還有些演算法和advanced data structure的重點覺得沒有在leetcode裡面很好體現的,總結如下:

  1. 很多recursive容易的演算法也要考慮iterative方法。因為掌握iterative代表你對問題結構理解上升了一個高度。e.g. reverse linked list, tree traversal

  2. i) top k (kth) elements: heap O(n+klogn), quickselect O(n) average O(n^2) worst, median of medians O(n) worst. cons and pros. Extension: what if all data can not fit into memory. heap size of k O(nlogk) for single machine, many machines see 3. ii) get median in data stream: max heap + min heap

  3. kth element in many m machines: binary search, pick a pivot and see how many less and larger among all machines, then discard halves accordingly (distributed quickselect)

if sorted in single machine: find smallest (k/m)th element among all machines and discard the less partition.

  1. stack support O(1) getMin queue support O(1) getMin e.g. k sliding window, most frequently clicked url in past 12 months.

  2. reservoir sampling for infinite stream, generate random(1-7) with random(1-5), card shuffle, string permute in place

  3. data structure with O(1) insert, delete, getRandom, get: hashmap + array

LRU data structure: hashmap + doublelikedlist.

binary search tree with rank() (position of inserted or queried data) (add treesize attribute for each node)

  1. bit operation and bitset. e.g. find missing number in large data, reverse binary number,

  2. java multi-threading, blocking queue, nonblocking queue, H20, philosophy dining, deadlock checking. 現在是個公司都問concurrency,一定要好好準備。

  3. OOP: elevator design, parking lot design distributed: large log file design, social network design, distributed cache design ....

本人已掛等待明年滿血復活,祝各位job hunting順利。

本文來自微信:待字閨中,2013-10-05釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章