Airbnb電面面經,Airbnb電面面
Airbnb的題目往往都很囉嗦,其實簡單幾句話就可以概括的。要求代碼寫完了能夠編譯,然後自己寫測試案例並跑過。感覺這樣的好處是的確很考察代碼功力,那種當場一次bug free,然後跑幾個測試案例全過的感覺很爽。不好的地方是容易增加變數,因為即使自己本身水平不變,不同時候發揮略有差異,檢查一兩個bug用的時間可能就沒機會做後面的follow up了。
第一輪實現分頁顯示。給了以下一些輸入資料,要求將以下行分頁顯示,每頁12行,其中每行已經按score排好序,分頁顯示的時候如果有相同host id的行,則將後面同host id的行移到下一頁。
[
"host_id,listing_id,score,city",
"1,28,300.1,SanFrancisco",
"4,5,209.1,SanFrancisco",
"20,7,208.1,SanFrancisco",
"23,8,207.1,SanFrancisco",
"16,10,206.1,Oakland",
"1,16,205.1,SanFrancisco",
"6,29,204.1,SanFrancisco",
"7,20,203.1,SanFrancisco",
"8,21,202.1,SanFrancisco",
"2,18,201.1,SanFrancisco",
"2,30,200.1,SanFrancisco",
"15,27,109.1,Oakland",
"10,13,108.1,Oakland",
"11,26,107.1,Oakland",
"12,9,106.1,Oakland",
"13,1,105.1,Oakland",
"22,17,104.1,Oakland",
"1,2,103.1,Oakland",
"28,24,102.1,Oakland",
"18,14,11.1,SanJose",
"6,25,10.1,Oakland",
"19,15,9.1,SanJose",
"3,19,8.1,SanJose",
"3,11,7.1,Oakland",
"27,12,6.1,Oakland",
"1,3,5.1,Oakland",
"25,4,4.1,SanJose",
"5,6,3.1,SanJose",
"29,22,2.1,SanJose",
"30,23,1.1,SanJose"
]
這題的思路不難,但是實現起來還是有點難度的。在遍曆的時候需要維護一個LinkedHashMap作為page並且完成去重。用LinkedHashMap的好處是可以保證所有的entry是按插入的順序排序的,所以仍然可以保證按score排序的性質。另外,一旦遇到相同的host_id,則將其對應的行存到另一個buffer裡。由於需要變遍曆邊增減容器裡的資料,需要用ListIterator,並調用remove和add方法。之前只用過remove,從來沒用過add。
第二輪是他家一道高頻題,給一堆租房的request,作為輸入數組,找一個array subset,其中任意兩個元素不能相鄰,(因為要打掃房間),求使得子集裡所有元素之和最大。一維DP解之,另外可以使用滾動數組讓空間開銷為常數。
第三輪是實現一個CSV格式的Parser。其中處理逸出字元比較tricky,當時只給了三個最基本的test case,所以都過了,但是由於花了些時間debug,有些特殊情況一開始處理錯了,後來沒時間進行處理了。這一輪面得很鬱悶,面試官沒怎麼理我,感覺在做自己的事情,沒什麼交流。測試的時候把不小心把輸入內容給貼錯了,花了不少時間檢查。
他家的題目感覺除了第二輪實現起來簡單,其它的題目都要寫不少代碼,45分鐘碼完bug free的確不簡單。