1月11號去西雅圖總部面的。1月16號星期一收到的感謝信,雖然跪了,還是寫下來吧。
因為簽了保密協議,又因為很多阿三會找我們的面經,所以代碼和描述都是取近義,盡量給后來的同學講明白。
新蓋的樓,叫"Day 1",聽說是取自CEO的一句名言。
頭一天晚上去踩了個點,從住的酒店到大樓最多10分鐘。
我是提前半個小時到的,看著公司的人進進出出就也就沒這么緊張。
幾個之后的同學問到的問題:
- 保密協議到前臺也可以簽,不想自己打印的可以直接到公司簽。
- 不用存包,帶著自己的包上去。
- 手機會要求你關掉。
- 提供早餐和午餐,食物是能量,能吃就吃。
基本是三個人一個組,在recruiter嘮叨半天之后,開始進入面試正題。
第一題
每個組會得到一個問題,每個組員會拿到同一個問題的不同解決方案。小組討論每個人的解法有什么優缺點,分析時間復雜度,然后給三個解法排個序,哪個相對來說最好,哪個相對來說最不好。(根據地里面經,一般都是 2 > 1 > 3)一共好像是15分鐘。包括討論和跟一起跟面試官交流。
我們組抽到的是【排名前M】的那道題。這道題LeetCode上有,大家都應該做過。
注意仔細審題
題目要求 只考慮時間復雜度,不考慮空間復雜度,不用優化。但是面試官會要求小組提出優化的大概方向。
三個不同的解法。
第一個是暴力,不多說。
第二個,也就是我拿到的解法, 快速選擇 。
第三個是用 優先隊列,也不用多說。
第二個解法其實是不完整的代碼,缺少遞歸的部分。(不知道我說啥的同學,按照上面三個解法把原題做一遍就知道了,這里就不貼代碼了。)
不完整的代碼是肯定墊底的。
然后排序完之后,會給面試官確認。面試官一般都會問問優化的問題。注意表現出領導力,這是亞麻看重的地方(帶著其他人審題,分析代碼什么的)
第二題
這就是傳說中的送貨問題。(代碼在最后,百度云,密碼是:k四五六(換成阿拉伯數字即可))
Tips:在寫代碼中途會有一個30分鐘的一對一interview。主要是講第一小題的解法和第二小題的思路和實現所用的數據結構。自己去選擇自己的時間段(一共有4個時間段可以選),我建議選擇第二個時間段,當時我就選的第三個時間段,結果輪到我的時候,我基本上都寫完了……
把每一道題的時間復雜度分析清楚,因為在提交代碼之后還會有一輪15分鐘的interview,就會讓你解釋每個解法的時間復雜度。
題目背景大概如下:(建議配合代碼一起看,上傳的是Java的版本)
公司的主要業務就是淘寶。那么淘寶就需要送貨。從用戶下訂單到送貨,有很多因素需要考慮(庫存量,庫存所在地,收貨地區,運費等等)。
每天公司都會產生很多的訂單,每一個訂單對應只有一個商品(一個商品ID),而公司在全國幾個大的地區都有設置倉庫。倉庫里有商品,每個商品有不同的ID唯一識別。另外,每個倉庫都有能從自己的所在地運送到其他地區的費用和方式。
三個小題:
- 給定 一個商品ID 和一個 目的地,返回所有對應這個商品的庫存 和 運送花費。
- 給定一個訂單的列表,要么滿足運送最多的訂單,要么滿足最小化遲到的訂單(盡量在用戶預期時間內送到)
- 跟第二小題一樣的輸入,滿足平均每單運費最小。
在第二小題和第三小題中,只需要完成核心的算法代碼部分,輸入和輸出都不用擔心,并且在運行主函數的時候,會有百分比打印在console上。
我第三小題沒有做,但是在第二小題里,基本把第三小題也做了,結果記得是91%的fulfill orders,30%的ontime order,$4的average shipping cost
題目本身并不難,而且也并不需要很復雜的實現,什么樹,什么圖都用不著,要么排序,要么用優先隊列。主要考慮的是很多edge cases和優化。
- 對于第一小題的建議是,先寫暴力的方法(兩個for循環嵌套),等出去一對一的時候,就可以讓面試官問優化的事,然后一秒鐘答上用HashMap。讓面試官感覺你反應很快。
- 對于第二小題,見仁見智,反正寫出的算法合理并且復雜度不要太高就行。
- 對于第三小題,對shippingcost排個序,然后想想優化就行了。
為什么不多說,是因為亞麻考這題就是看每個人的思路,說的細致了就給大家有了先入為主的框架,想edge case就不好想了,另外每個人的解法都不一樣,如果能有用樹或者圖,面試官同意,在2個小時左右能夠寫出完整代碼的話,也是可以的,反正我是沒有想到……
鏈接:http://pan.baidu.com/s/1i48itBB