註:因為有NDA的關係(就算沒有也是保護一下公司)
面試篇每一篇都不會把確切的題目打出來
(我看每個人的心得文都有提到題目類型,感覺分享題目類型還是ok的)
(難度不會用Easy Medium Hard表示,請見你可能不知道的 Leetcode 小知識
(HR看到這篇覺得有什麼東西不希望被分享的話請寄到gmail信箱sendmefkingspammail)
因為去年準備面試也是準備了很久,大概四個月,
上一次被殘忍拒之門外後,
前五個月在耍廢,看到乾leetcode排行榜上那些神人過來跟我一起面試的話
我肯定是被痛宰,後四個月痛定思痛認真刷題
這次面試前是950題,leetcode rating 2200,覺得再不丟面試要堅持不下去了
總之九個月之後,又寫email給當初的HR(發換她職務有變換成另一個HR處理)
好消息是Google台灣仍然在招人(招手~ Google台灣應該會一直一直招人只是名額多寡的差異~)
不過這次面試還是失誤的地方很多,如果讀者不小心犯太多錯,非常有可能被down level,
都走到這步,明明刷的題目很多,在學經歷上也是表現的很不錯,
但因為面試時的失誤造成職等差了一些,筆者覺得是非常可惜的
這次面試四關全部都是中國人,不確定有沒有相關但剛好遇到的面試題也都比上次困難不少
全中文,一個在新加坡工作的中國人,
打到我手機的故事 前面分享過了XD
面試官後來就算進Google Meet也是從頭到尾沒開視訊
不過經歷了上一次的第三關,現在筆者心態上已經正常很多,總之就是只要刷題刷到題目都會寫,沒有面試官的提示或是幫助也是沒關係的!!
同之前的文章,因為沒開手機聲音這個失誤,所以開始面試的時間晚了10分鐘,
面試官很好心的問我等等有沒有事,沒有的話那等等結束的時間會晚10分鐘
Tree的經典題目加一點點變化(難度應該1600-1800)
因為刷題刷得很熟,(Tree的題目就是要盡量利用樹的遞迴性質)
所以看完題目其實就差不多想到方向,用小例子試了一下子就發現解法
然後就講演算法,講一講發現不如直接打pseudo code,打一打pseudo code發現就寫完了...
(有一點扣分的是直接開始寫code的時候被面試官叫住叫我先定義好TreeNode的內容)
問完時空複雜度之後面試官表示: wow我們晚了10分鐘開始該問的都問完了但是還剩下15分鐘...
然後因為是phone interview,問了問也沒有準備進階題
就開始聊天,面試官表示他因為remote跟時區的關係一陣子沒有面試別人了
我是最近第一個
不過我主動要求我還是想想看edge case dry run一下我的code吧(想要讓他的report可以更好寫)
結果就發現有bug XDDDDD 而且還是面試官發現的!
嘗試了一個fix就修掉了,感覺面試官也不太在意
自我感覺Strong Hire或是Hire(因為耍蠢寫出bug)
VO有一個被雷到的地方是原本想要一天四場一次KO,排了週五想說週末可以好好放鬆休息
結果週四晚上8點排schedule的印度小哥說隔天中午第一場的面試面試官臨時有事,要之後再約時間,大受打擊(後來最後一場面試官也no show…)
題外話,這次有特別問HR說面試語言部分,
為什麼上次說好2英2中變成3英1中,
不過HR也有說他們面試官也常常搞錯,
而且這次經驗比較豐富,
就算是英文思考跟數數也不太卡,所以也就沒有特別在意面試的語言是什麼
全英文,好像是在北京工作的中國人,講話講很快英文的中國口音超重,
但是中國的英文口音蠻好懂的,溝通上完全沒有什麼問題(跟去年比起來...)
一題蠻複雜的掃描線題 因為題目很複雜如果出在leetcode難度應該有2000~2300
但是在實際面試因為面試官不會去run code跟測一堆很難的測資,所以難度要再降
筆者很幸運的前一個禮拜有練到這題的類似題,
也是看到題目就知道方向跟演算法
我限制了一些input條件之後就開始講演算法
面試官提出了一個他覺得要做的Todo,我也有針對這個Todo提供了演算法
(但這邊有一個失誤是我沒有把這個Todo打下來)
中間寫code我寫蠻快的,但是因為這題就蠻複雜的要處理的東西有一點點多
所以雖然我一邊寫一邊講,而且有反覆溝通確認,但是面試官還是感覺沒有很跟上
(失誤2,感覺被扣分蠻多的,但一方面也有可能面試官第一次考這題)
後來寫完之後 我就說我大致上寫完了
但是面試官就說你還沒有寫我剛剛講的那個todo(猜測這邊也被扣分)
後來改了一兩行code之後面試官感覺有滿意,時間也還剩蠻多的(大概20分鐘印象中)
接下來比較不是我能控制的部分就是我們的coding session就開始瘋狂斷線重連
(感覺跟偉大的ZG網路GW以及谷歌的VPN有關)
但是視訊跟通話部分都是好好的
面試官就說那我們來問問看別的(比較考Googlynees,
(但不是BQ的那種,也不用打code)情境/創意題題的題目,自我感覺回答的普通,
特別的是原本的題目就連時空複雜度都沒有問,
但也沒辦法問因為後來就coding session完全斷線了
自我感覺 Hire
全英文,所有公司所有面試唯一遇到的女面試官,
好像是site在moutain view但是在中國remote的中國人,
充滿強者氣息....
事後查了一下發現是北京某個985大學資工系卷一.... (跪)
題目是Math + DP而且有進階題,
題目本身沒那麼難找到規律,
我當初還是用小case試了幾個方向被面試官冷冷的說這樣不對,
卡了很久有點當機,本來就很緊張再加上面試官說,
這只是第一題不用想得太複雜太難
乾,好像這題很簡單應該要馬上就想出來一樣,就更緊張了
大概花了10~15分鐘用小case試了試,總算發現用某個經典的DP套路能夠解決
表現不好的地方是我這題的邊界條件部分也一直給的是錯的答案,
靠面試官提示才有改對
(面試完再去查,發現難度真的蠻難的,查不到原題,
發現的類似題某題號1500以上的leetcode hard加鎖題(我沒有買premium所以也沒寫過))
總之演算法想出來之後寫code的部分就很快很自然沒什麼大問題,
(最後HR有提到feedback是code寫得很快也很乾淨)
然後被問了follow up是剛剛提出來的演算法並不是最佳解
有沒有什麼方法可以在時間複雜度上優化,
運氣很好靈光乍現剛好就一眼觀察出能優化的部分(有一點像是coin change 2那種優化吧)
再問了跟寫了記憶體空間優化,就進入第二題
第一題解出來之後想到第二題可能沒那麼難,但第一題估計難度有(2000~2300)
很幸運的也一下子就看出來第二題應該要怎麼寫,
把第一題還沒優化過的code貼過來改一改就寫完了,
但是還是有被提到目前的解不是時間複雜度最佳的解
因為一開始卡太久,觀察了一下沒看出來規律時間就到了
然後面試電話掛掉的3分鐘後就想到怎麼解了(但也來不及拉QAQ哈哈哈哈)
自我感覺 Weak Hire到 Weak Reject之間,因為一開始演算法卡太久跟邊界條件一直有錯
一樣中文聊天,有準備亞麻的BQ的話其他真的都小菜一碟沒什麼好分享的,問的方向也不會像亞麻那麼刁鑽
也是很雷,面試官no show… 等了10分鐘之後寄信給當初排schedule的印度小哥想說請他幫我聯絡一下面試官,結果也沒回我,我怕面試官看錯面試時間一個小時所以乾等了一個小時但顯然是沒等到,心情超差
不過就跟第一關coding一起移到下禮拜面
後來的補面(也不知道是不是同一個放我鳥的面試官面我):
全英文,好像是上海的面試官,也是全程沒有開視訊
因為筆者有額外在寫CSES problem set,
剛好三天內有做到一個非常非常類似的 PQ (greedy + simulation) 題目,
個人感覺難度有1900~2100
總之聽完題目演算法就有了然後寫一寫也是沒有bug就寫完了,
印象中這題沒有進階題,寫完了可能還剩15分鐘左右,
面試官看時間還很多就再問了一題毫不相關的 01 BFS/Dijkstra題,
不確定到底是他臨時起意(應該不會是臨時起意),
但總之他沒有把題目貼過來所以我們隔空交談確認題意談了一陣子
所以也沒有很多時間讓我思考,不過運氣很好的是,
那陣子Leetcode比賽第四題就有出一題01BFS題,
總之也是馬上知道演算法要怎做,打完演算法大致上整題框架的code後就時間到了
自我感覺 Strong Hire 或 Hire ,自我感覺因為沒有犯任何錯 是有希望拿Strong Hire
後來兩個禮拜之後收到HR Feedback,
原本覺得表現最差的第二關沒什麼大問題,感覺是Hire到Weak Hire之間
反而是還算蠻有自信的第一關,給的評價類似Weak Reject,
說code readability不太好,不過我覺得比較無辜的一點是後來就開始瘋狂斷線
當初以為面試官會跳到其他題目是因為原本的題目就算法的部分破關了
(面試官好像也沒有在report上註明我們有斷線這回事 有點無奈)
因為沒有把code寫完會扣更多分,所以我一開始都會用比較簡略的naming,
有些比較有資訊的會命名像是map<string,int>
用name2Idx之類的
但暫時想不到怎麼命名的vector
就會是v,priority_queue
就會叫pq等等等
如果有寫完會再回來修變數命名那些
但那關斷線之後基本上我也完全沒辦法回頭改這些東西,
而且這三場面試我都維持一慣的coding/naming style,
第二關的feedback就是code乾淨清晰
但是第一關就是readabilidy不好,
我覺得可以改進的地方就是如果演算法有很快地想到,對題目很有信心,
那發現面試官沒有很跟上的時候可以停下來重新改一下naming style之類的,
不要用pair<int,int>
直接去代表什麼東西,
自定一個struct with appropriate mebmer variable都是很好的方法
不過總之HR還是會幫我送Team Match (可喜可賀..)
HR當初特別叮嚀我,很重要值得分享的是,
不要浪費這個寶貴的時間,
問一些可以問HR就可以拿到回答的問題
(後面文章會再分享)
然後我以為會在不同的大組(Next/Chrome/Pixel/Cloud)之類的不同Team做match
但因為當初都是丟Google Cloud,總之也沒得選就是Match了兩個Cloud中的不同Team
最後被現在的主管好心收留 QAQ~
送Hiring Comittee是最緊張的部分,
我是先開始Google的面試流程,但是因為G社中間還要Team Match之類的,
所以最後是亞麻先給我一個package很有誠意的L3(統一以Google的職等描述)offer
但因為Google面試完的結果不是沒有想像中的好,
很怕原本target的L4會被down grade成L3,或是還要再加面(因為亞麻已經等我一兩個禮拜了)
就筆者的理解Google應該無法compete亞麻的這個L3 offfer的數字,所以如果Google沒有給我L4我就要跟Google說再見了
總之HR會跟你要一些在以前公司的職等等等寫一些documents還有請認識的Googler寫一些support documents,還有請要收留我的主管寫很多documents,還有目前的compete offer(我是直接給數字)然後就只能燒香拜拜拉~
總之最後運氣很好的是沒有被lowball,但是運氣很差的是遇到Hiring Freeze,這個故事又長到可以打一篇文章,之後會再分享
從這兩次面試的例子可以看出來
除了自己能做好的部分(刷題,心態,經驗)
而且能遇到的雷事都給我遇到了,相對第一次的雷法,
這次運氣很好的,
放我鳥的面試官居然考了一題我三天內寫過的CSES problem set的題目
還有這次被考的題目也比較完整(是平常比較會準備到的那種 Tree/DP/PQ/掃描線)
第一關面試那個斷線已經沒什麼好抱怨的了
整體而言,整個面試過程都是非常非常吃運氣的
尤其是職等的部分,如果被down grade了也不要氣餒
每個面試官在意的部分都不一樣
心裡的尺的度量衡也都不一樣
面試的表現和面試官覺得你的表現
的有時候真的不是自己能掌握的
只能說像是刷題刷廣刷深刷熟這些
自己能做好的部分就是好好把握
然後可以盡量不要犯筆者曾經犯過的錯,
在寫註解/習慣用文字畫圖/用小case dry run/仔細檢查/變數命名/仔細確定面試官有跟上
這些小細節上也盡量都做到最好
BTW, 進來之後發現同事分數動輒都是2300 ~ 2500之類的,
某些東南亞國家的Leetcode第一名..
不少穿著code jam t shirt的 & 打過ICPC的...
只能說當初運氣真的算得上好...
以上就是谷歌TW面試小經驗和秘笈,祝各位武運昌隆!