非斯不可 SWE實習 time line

大家好,我是新人。長久以來一直受地裡朋友們的幫忙,
第一次發帖,想說有結果了以後該來好好整理一波,回饋地裡。

首先是time line

9/20 - hello from WhatsApp (Career fair 投的)
當時收到了WhatsApp的on campus面試邀請,但因為LZ沒有眼殘沒有注意到信箱,等到發現這封信,所有time slot都已經被填滿了。
當下心裡萬分懊悔,立馬寄信給HR,(因為HR信裡提到on campus名額有限,其他人將會安排電面機會),苦等幾天不到回信,心裏其實已估計是涼了。
10/4 - Update from WhatsApp
HR終於回信說,因為他們recruiting policy有改,WhatsApp將不再繼續招人了,然後信裡頭接著說,將會有另外來自FB的recuiting team跟我聯絡
於是乎就這樣陰錯陽差下拿到了臉書的面試(其實我Career Fair也有投臉書,但就沒拿到面試),接著給了資料後就約了第一次電面時間。
10/12 - 第一次電面 from FB
面試的是一位印度小哥,人很nice,但其實我有點聽不太清楚他是哪一組的、做什麼的。全程電話面試看不到表情跟嘴型,所以溝通上其實挺吃力的
面的題目總共有兩題
1. input: string A, string B e.g. (A = “2a3b”, B = “aabbb”) 問A == B ? or not
我的做法是用兩個指針從頭掃到尾,如果一個字不對就return false,反之如果for loop 跑完就回傳true
興沖沖解完之後印度小哥說有bug,我當下是直接慌了,因為一直以來都聽說要bug free。
那時實在太緊張,所以並沒有找到bug,只是反覆不斷的把每一行code的邏輯講了又講
最後小哥說: 如果input是 A=“2a5b”, B = "aabbb"呢
我才發現我就算iterate完 B,最後也是要檢查A的指針有沒有指到底,不能無腦回傳true,當下心裡涼了一半。
2. input: dictionary of strings D = {“abc”, “apple”, “app”, …}, string s = “apple” 問: s有沒有在 D裡面 (s 可包含 ‘’*’’, ‘’.’’ 字元)
我的做法是利用trie來解,相信地裡的朋友對這題應該都不陌生,最後討論了時間複雜度 ( # chars in D) 結束這回合。

10/15 - 沒想到拿到了第二次電面,經過這次經驗,我認為其實重點並不是要bug free,我猜想只要方法是對的,一些無關痛癢的小bug應該都是在可接受範圍內
不過我也決定要好好把握住這次機會,因為不能總是倚賴這樣的僥倖,當天立馬買了離口premium,開刷臉書tag
第二次電面約的是10/25

10/23 - 原本想說期中考(10/24)完再來好好衝一整天的離口,但發現期中考真的唸不完了,前一天可能得需要熬夜,考完想要好好補眠,於是寫信問HR能不能多延一個週末。
寫信當時心裡頭是非常猶豫,因為我一直都覺得造成HR的麻煩可能會降低自己被錄取的機會(雖然朋友們一直勸戒我這是錯誤觀念)。
但最後還是決定造成HR麻煩,不要跟面試過不去,改期一次,HR很快就回了,他幫我改到10/29。

10/29 - 第二次電面 from FB
這次面試官是一位白人叔叔,但聽起來不太像美國人,可能是歐洲來的。這次有開視頻。不像以往的每個面試,這次面試官話特別少,加上我其實英文並不是很6,
整個面試過程大多是我主動找話講。這次還是考了兩題
大叔先問我知不知道palindrome,我答大概知,就是頭尾兩兩一對,字母一樣所構成的字串。接著說題目是
1. input: string s 問能不能用s 做出一個回文 by removing at most one chars
我第一次聽完解釋,以為題目是可以將所有s的字母打散整理成一個palindrome。得意得向大叔說,我會想要count每個字母的次數,然後算次數是odd的有幾個字母,
因為回文最多只能有1個這樣的字母,所以我只要判斷是否 <= 1就可以知道能不能把s做成palindrome。然後因為可以remove at most 1 char, 所以我其實就是判斷是否 <= 2
語畢,大叔聽完非常沈默。我心想可能是我的argument不夠嚴謹,或是有一些counter case。於是我開始舉一些例子,試著想用簡單的幾句話證明我的argument
接著大叔說,如果input是 “ccabba"呢? 我答是,因為可以把它排列成 “cabbac” 甚至不用remove 字母。
這時大叔才發原來是我搞錯題目了。
原來題目的意思是並不能打散s 字母的順序,然後只能最多remove一個字母 其他後面原封不動接上。
前面花了15分鐘才發現是搞錯題目,但這時我也沒想那麼多了,心裡只是想好好把握時間趕快想解法。
最後我是稍微modify 了function
bool isPalindrome(s, head=0, tail=s.size()-1, coda=1)
基本上就是從s[head] == s[tail] 掃到這兩個指針相遇為止,
如果 s[head] != s[tail] 就檢查還有沒有coda, 有的話就是return isPalindrome(s, head+1, tail, 0) || isPalindrome(s, head, tail-1, 0)
意思是說因為head跟tail發生衝突了,這時一定得remove其中一個,否則這字串成不了palindrome,第一個call就是假設remove了s[head],第二個是假設remove了 s[tail]
只要其中一條能做出palindrome那就是true,反之則是false
2. 第二題是給一個 dict of strings D = {“abbcb”, “aabbc”, “abccb”, …}, order = [’‘a’’, ‘‘c’’, ‘‘b’’] ,問: D有沒有按照order排序
基本上題目的意思是就是說現在 ‘‘a’’ < ‘‘c’’ < ‘‘b’’,所以"abbcb” > “aabbc”,因為這兩個字串第二個字母的比較是 ‘‘b’’ < ‘‘a’’,所以要回傳 false, {“abbcb”, “aabbc”, “abccb”, …}並沒有按照order排序
一開始說用brute force的話就是把所有D裡面的字串抓出來 倆倆按照order比較是不是有violate,只要其中一個violate就回傳false
然後問面試官說這樣的解法會不會太慢,面試官的意思是說如果能想到更好的,go ahead.
接著就陷入一片沈思,大概花了10分鐘一直不知所云,講了一個東西,然後再自己發現不行,自打自己臉,就這用重複了不下兩三次還是沒想到好方法(整個過程大叔都是安靜的)
最後大叔忍不住了終於開口,不然我們也可以先試試你說的brute force,再想辦法改進。
洋洋灑灑寫完了brute force的比較後,大叔說還是有bug。我後來發現是一些typos (我把variable的name打錯,由此可知他們應該是真的會把你的code拿去跑)
時間複雜度大概是 O(n * 兩個字串的比較) (note: 有了之前類似經驗,這次有記得字串比較最後一定要小心兩個字串到底一不一樣長)

      接著就進入了提問時間,大概就是問一些他們team在做什麼的這樣。最後大叔說你的結果應該過一兩週就知道了。就掛了電話。
      因為地裡有拿到offer的人都是面完一兩天內就收到,所以我心裡想應該八九不離十是rej,頂多賺到加面。原因是我一直覺得自己英文的表達能力不是很好,而且第一題搞錯題目,第二題又卡了10分鐘原地自轉沒結果。

11/7 每天都上地裡看臉書面試的結果,越看越篤定HR是正在撰寫拒絕信準備送來,所以也就沒有催問update。大概等了一個禮拜多,就在今天上課上到一半收到offer。

背景 :CS MS
練習programming的方式:
Leetcode problems 目前寫3百多題了, Leetcode contest (大多時候是一兩百名,只有一次50內),
codeforce, codejam kickstart (後面兩個通常是去當砲灰,但我覺得那邊的題目跟leetcode很不一樣,而且練完大多都滿有收穫的), ICPC考古題 (通常有詳解)

我的練習方法就是分 1.固定刷、2.練想法兩種類型,我每天大概會固定刷個3-5題leetcode,其他時間就是去上面那些其他地方找題目來練想法。
其實我不曉得練想法對於找工作有沒有幫助,但每次學會新方法來解不會的題都會讓人感覺自己變聰明了一點點,我滿喜歡這種感覺的。分享大家。

最後想跟大家說的是,有時候沒等到好結果並不代表自己不夠好,很多時候是運氣因素,
像我一直都不覺得自己哪裡強,這次能拿到offer我八成歸因於運氣,
所以還沒拿到offer的朋友不要把自己逼得太緊了,好好調適心情才能走更長遠的路。這是一場長期抗戰,offer並不是終點。
然後就是,臉書offer也是有可能晚個一個禮拜才到的,不一定總是一兩天內發,還沒等到結果的人千萬不要放棄希望,相信大多人的面試流程是都比我更順暢,表現比我更好的。
很久沒寫這麼長的文了,文筆不好請大家見諒,希望對大家有幫助。 最後就是希望能賺些,感謝大家,祝大家都能找到喜歡的工作。

恭喜楼主!周五二面,沾沾喜气~

多谢楼主分享
请问WhatsApp具体是为什么不招intern了呀

具體原因他並沒有告訴我,只說是今年的recruiting policy改變了所以停止招人,接著他就直接介紹FB的HR給我說以後有什麼問題都跟這個人聯絡。

trie的那道题我只做过"."代表任意字母的。请教一下*是代表什么?搜了面经 没有找到这道题,请指教~

应该是没有*,有的话就是dp了,匹配两个字符串都要o(nm),n、m分别是两个字符串的长度

‘’*‘’ 代表任意長度的任意字串(可以是長度為零)

我的想法是
如果把整個dictionary想成是一個tree,
那麼搜索空間最大就是所有node的數量,
也就是所有node的數量。
而所有node的數量就是dictionary中所有char的數量

问题是,trie里面的str并不是一定和target string匹配啊,如果允许有*,“判断是否匹配”这件事本身就是o(n*m)。否则的话,正则匹配那道经典的dp用trie就可以o(n)搞定了

哦對 你說的沒錯
這樣我那時其實答錯了
運氣運氣