刷題系統設計網站整理:
https://leetfree.com/
https://www.zero1code.info/
--
Master在美國找工作實在是太不容易了。
相對於本科生和博士生,Master的上學時間只有一年半到兩年。這意味著最多只有一次實習機會,有一些春季入學的同學甚至實習機會都沒有。要想把握這次實習機會,意味著一入學就要開始找工作,完全沒有緩衝的時間。對於大部分本科畢業、沒有工作經驗就直接出國的同學而言,生活上、學習上、就業上的壓力一起襲來,滋味真是妙不可言。
更重要的是,找工作是一個高消耗的過程,對於時間、精力的要求都很高。如果沒能把握節奏,讓自己處在一年到頭都在刷題、找工作的狀態,壓力太大,就容易出現一鼓作氣,再而衰,三而竭的情況。寫這個帖子,是希望以我個人微薄的思考和經驗,啟發更多的人規劃好timeline,以最高的效率拿到心儀的Offer。
本帖子與Cracking the Coding Interview 153, Leetcode Discussion和地裡的其他大佬討論結合效果更佳。當然,一家之言並不能當作萬能寶典,歡迎各位壇友看了之後提出建議。
我把新人找工作分為三個準備部分:
簡歷(behavior question)
刷題(technique question)
Networking(內推及信息收集)
接下來就按照這三個部分進行闡述。重點還是放在刷題這個部分,畢竟這是最多人頭疼的,其他兩個部分就講講自己的體會了。
一、簡歷
簡歷已經是一個宏觀概念了,包括你的Resume、linkedin、Handshake、Piazza Career等等。這些東西都要記得保持同一版本、同步更新。
我們可以拿起自己的簡歷檢查一下,有沒有滿足下面兩點 :
格式清晰,重點突出
我自己是習慣用Latex寫簡歷的,至少永遠不用操心對齊了沒有、間距一致不一致這種問題。就這兩點已經甩了word幾條街了。即使沒用過Latex,學習一下也很快。
網上有很多Latex簡歷模板了,有興趣可以挑一挑:http://www.LaTeXTemplates.com 205
內容精煉有重點,不浪費一個字
首先,不能有錯別字和語法錯誤,這是最基本的。每一次更新完內容,都要檢查一遍。我曾經有一個時間寫錯了,投了好多家公司才發現,悲傷。
其次當然就是內容。要想有好的內容,最簡單的就是不斷找人修改簡歷。Career center的老師,已經工作的前輩,同齡人,外行人,每一種都要找人幫忙看看。
但是每一個人的角度和見解都是不同的,尤其是Career Center的老師。同一份簡歷,這個說關鍵字要加粗,那個說加粗不好看,反反覆覆改來改去,很煩人。 我找了十幾個人看簡歷之後,覺得如下的方式是最高效的 :
找一個/一群正在找工作的小夥伴,互改簡歷。方法是你把自己的project用最詳細的方式敘述一遍,讓小夥伴提建議怎麼寫、哪幾點最值得寫。最理想的簡歷,要包含技術關鍵詞,並且每一個bullet point都是「我做了什麼+一個量化的結果」,比如:我寫了個網頁+訪問量達到1000/天
找一到兩個前輩,最好已經有審簡歷經驗的,檢查你的內容重點夠不夠吸引人、能不能寫得更吸引人。
重複前兩點,直到前輩們看過都說好。
找一到兩個Career Fair老師改簡歷,主要改的是格式、語法和用詞。
每次有了大的成就(上完一學期課、實習完、研究階段性結束),都應該第一時間重複以上步驟,更新好自己的簡歷,這樣可以有效避免因為簡歷沒寫好而帶來的拖延症。
然而,還有很多人煩惱的原因是自己的簡歷上沒有啥東西可以寫 。這種情況,可以按以下幾個步驟處理:
不管怎樣,先湊出一頁簡歷
秘訣包括:加大頁邊距,加大字體,能寫成兩行的不寫一行,寫各種獎學金,把所有有關課程的全名都完整寫上去,把所有課程project甚至作業都完整寫上去(還可以加上全班100個人我第6這樣看起來很威風的話……)
湊的時候堅持兩個原則:
瘋狂積累相關經驗
學校相關課程是效率最高的途徑 。選擇幾門有課程project或者作業設計得好的課,一學期下來就能積累3~4個不錯的project。千萬不要小瞧學校的project,也不要覺得大家都做過的作業就不能脫穎而出——很多HR也不懂這些。我一個很好的朋友,是那一屆的面試王,拿到了Apple, LinkedIn,Pure Storage的Offer,而她的簡歷上有三個Project都是學校的課程Project。
積極當TA。沒有相關的工作經驗或實習經驗,就當TA或者RA。未必要學習成績很好才能當TA,主動聯繫教授表達自己想當TA的熱情,多talk幾次,成功率很高(很多教授也缺TA)。如果能當上經典課程的TA,HR青睞的機率大大提高,Career Fair遇到校友也會對你另眼相待。
學習網上的相關課程。不過這是我覺得效率最低的途徑。一來這會佔用你本身學業的時間,二來網上課程質量良莠不齊,缺乏自制力的人也只是交錢買安心罷了。
簡歷寫好之後,更關鍵的問題就出現了——Career Fair talk和Behavior Question
強烈建議大家左手拿起自己的簡歷,右手拿起Cracking the Coding Interview 153或者學校Career Center列的經典BQ問題清單, 一條一條寫答案 。每一篇答案就是一篇小作文,圍繞:
最好所有簡歷上出現的經歷都準備幾個小故事,避免面試官有「你怎麼說來說去都是這一段經歷的故事」這種想法。
這才是效率性價比最高的部分。 天底下的公司BQ都是一樣的,一份答案可以用一整個求職季,一份準備好的自我介紹可以用一整個career fair,這是送分題啊同學們!(敲黑板)
對於重要的面試,要花心思量身定製一份答案,能留下最高的印象。比如同一個問題「你的偶像是誰」,面Facebook你就要說扎克伯格,面Amazon你就要說Jeff Bezos,面微軟你就要說Bill Gates。而且要有理有據有例子,讓面試官覺得你真心就是這麼想的,這就是你的dream company
二、刷題
刷題是大部分基礎不好的同學最頭疼的部分,也是最容易出現誤區的部分。 我總結了三大影響刷題效率的誤區 :
不管三七二十一,擼起袖子就刷題。只要我有決心,一定可以鐵杵磨成針!
刷題就是要看量大,只要刷滿300題,Offer隨我挑!
刷題就是啃硬骨頭,不會的題想一天也要想出來!vs 刷題就是背題,把題目背下來有一天自然會懂!
針對這三大誤區,我有如下心得:
1. 刷題是以「數據結構和算法」相關知識為基礎的
我看過很多地裡的「刷題心得」,鼓吹勤奮至上論,號召一切找工作的人每天刷三題,堅持下去就有offer。我相信過,但實踐效果很差。仔細思考之後,我認為是一種典型的不科學學習法。
我們學了這麼多年習,都是先講課再寫作業。寫作業從來都只是課堂知識的鞏固。課堂知識是系統的,有層次遞進的,相當於給房子打好地基和框架結構,而寫作業是添磚加瓦。刷題就是寫作業,對基本的數據結構和算法理解不深,只是知道個大概就刷題,實在是效率低。
我們可以先做一個大致的評估:請人在Leetcode所有分類tag裡都隨機抽取三道easy題(你並不知道題目類型),嘗試一下:
如果做到了第一層,可以直接刷題,在刷題中學習;做到了第二、三層,還應該再複習一遍Cracking the Coding Interview或者相關資料,再動手刷題;第三層也做不到,應該在學校裡面選一門經典入門的數據結構與算法相關課程,認認真真上一遍,再來刷題。
事實上,我認為第二層及以下,都可以考慮再上一遍數據結構與算法相關課程,有一個堅實的基礎。沒有拿到A,都不能算是學通了這門課。
2. 刷題和量沒有任何必然關係
我直到找到正職,一共只刷了162道題,其中Easy 64,Medium 83,Hard 15。這當然是有運氣成分在裡面的,但也側面說明數目不應該被拿來衡量刷題的掌握程度。 我個人認為按照這樣的原則刷題是效率最高的:
刷一道題,會一道題。會一道題,是指這道題再出現在你面前千萬次,你都能順利的寫出來,並且能夠 準確的分析時間複雜度和空間複雜度 。
刷一道題,掌握一道題。掌握,不僅是能AC,而是要掌握 最優解和經典解。 比如一道題DP是最優解,你還應該用DFS寫一遍,因為這也屬於經典解。我身邊有不止一個人面試的時候想寫DP,被面試官要求用DFS,或者想用DFS,被面試官要求寫DP。如果做題的時候沒有融會貫通,這個時候就容易卡殼,追悔莫及。
針對薄弱類別集訓。我剛開始刷題的時候,就是打開Facebook tag,按頻率題。刷了一定量之後,發現自己的Tree和DP特別垃圾,又將這兩個tag下的題集訓了一波,每一題都想:這個Tree題跟上一個Tree題都什麼不同?為什麼不能用相同的方法?坑都在哪裡?之後遇到這兩個類型,解題率就高了很多。
如果按照以上原則,每天啥也不幹就刷題,也不可能刷很多道。我狀態不好的時候一天只能刷三道題,狀態好的時候也就能刷七、八道。雖然刷題量很可憐,但我能感覺到我的AC率在以很快的速度上升。
3. 刷題不能死磕,也不能硬背
對不起說了一句廢話……這其實因人而異啦,我覺得 最適合我的高效刷題流程是這樣的 :
看題後思考5~10分鐘:用什麼數據結構?用什麼算法?空間和時間複雜度是多少?是不是最優解?
如果有信心能寫出最優解,或者覺得自己的解法值得一試:寫題10分鐘,debug最多5分鐘
如果寫不出來或感覺沒想清楚:立刻看Discussion裡面的最優解和經典解:分析空間時間複雜度,為什麼是最優解,為什麼能想到用這樣的數據結構和算法
看完解答之後獨立寫一遍,不設時間,寫到AC為止。期間如果想不清楚了,再重複上一步驟。
寫完還是覺得懵懵懂懂,加入一個list,準備二刷
另外,背題也是可以有很大作用的,但硬背的效率就太低了, 我的背題方法如下 :
實在連解答也看不太懂,就照著最優解敲一遍,或者一步一步的過一遍代碼
在重要面試的前一天/幾天瘋狂背做過的tag題:不是背答案,是把每一題的思路和坑都過一遍,相當於在腦子裡重新做一遍。這個方法對我來說相當管用。有些做過的題乍一看又不會了,但只要提醒一小點我就能想起來,那這「一小點」就是這題的關鍵,一定要記住。我面Facebook前一天背了一百五十多道做過的題,背到凌晨兩點半,感覺比我刷半個月的題學得還多……畢竟溫故知新嘛。
4.講題比刷題更重要
光會做題不會講,面試就容易出現「我的題目都做完了,也沒有bug,但是沒拿到offer」這樣聞者傷心聽者流淚的悲傷故事。講題是有套路的, 堅持以下這個流程 :
拿到題,先問問題。沒有問題也要憋出問題,比如數據類型,要不要考慮corner case,數據量多大,有沒有時間要求blablabla
分析題:一般是暴力解 + 最優解的分析順序。先說你拿到這道題之後的直覺解法,說完之後再「靈光一現」,說出最佳解法。如果你不確定這題怎麼做,這個過程就更加寶貴,你要充分和面試官討論這道題,徵求他的意見和建議,直到討論出一個雙方都滿意的解法。
寫題:千萬不要埋頭苦寫,每寫完一個子模塊都要跟面試官說一遍寫了啥,為什麼這麼寫。我曾經還用過一個小trick:有一道原題,之前刷題的時候有一個很細節的bug,我思考了很久才想清楚為什麼要這樣處理。寫題的時候,我想像面試官展示這個細節的精妙之處,就故意寫了bug,寫完這個小模塊之後假裝沉思一下,再一副恍然大悟的樣子跟面試官說「我突然發現這樣處理雖然看起來是對的,但其實有個corner case……」。面試官其實根本就沒注意到這有個bug,我解釋了一會兒,還舉了例子,他才發現這個處理的有趣之處。我相信這樣他對我的印象更深刻了。
主動跑test case:寫完之後,不要讓面試官開口,而是主動說「那麼現在我寫完了,讓我們來跑幾個test cases,看看這個算法對不對」,面試官好感度立刻增加。
三、Networking
這其實是很多人都忽略、但非常非常重要的部分。沒有絕對的實力優勢時,做好這一點是與他人拉開距離、高效率找工作的關鍵。
1. 列出target公司,找到refer
一般來說,target公司要列30~50家,需要掌握的信息包括公司地理位置、職位名稱、投簡歷連結、面試進程、refer人聯繫方式等等。在美國的職場環境裡,refer是非常非常重要的。如果有親近的朋友或認識的學長學姐可以refer,務必量身定做一封refer信。如果沒有,在地裡和LinkedIn上厚著臉皮也要求到refer,大部分公司,無論大小,refer大概率可以幫你度過簡歷關,甚至免去OA
2. 關注公司Headcount,不到高峰期不輕易投簡歷
很多時候,阻止你進入一家公司的不是簡歷和實力,而是head count。一家只打算招1個人的公司,你簡歷再強面得再好也未必能進去。一家打算招2000人的公司,你就做了兩輪OA也能進去。大部分公司都有半年到一年的冷凍期,如果因為headcount被拒了,就浪費了大好的機會。
可是,headcount這種信息作為一種「潛規則」,是不會被擺到明面上的。如何高效掌握這一動向呢?
與一起找工作的小夥伴密切的聯繫。可以建立大群,在群裡共享各種信息。
看一畝三分地的面試板塊,如果有一家公司頻繁有人報OA和Offer,就趕緊投投投
通過學長學姐或career fair等各種渠道掌握各大公司負責本校的HR是誰,然後LinkedIn和郵箱都毛遂自薦,爭取有headcount的時候他能想到找你
我深深的記得,去年秋招能過Facebook簡歷關的都是學霸級的人物,能拿到簡歷的更是鳳毛麟角。然而今年春季,HR都會主動在LinkedIn上reach out了,內推的通過率幾乎是100%。
我更深深的記得,去年因為Amazon不開headcount,無數師兄師姐叫苦連天,深陷找工作泥潭。然而今年春招亞麻爸爸似乎是想要把兩年份的都招回來,身邊兩輪OA+一輪VO順利上岸的不計其數。
所以說, 一個人的命運啊,當然要靠自我奮鬥,但是也要考慮到歷史的進程。我忍不住念起了兩句詩……
3. 關注LinkedIn上的工作更新
如果能做到一發布工作職位就投簡歷,拿到面試的機率會大很多。我身邊有學長學姐通過堅持在LinkedIn上第一時間投遞相關職位拿到了Google和Airbnb的Offer。
舉個小例子來說明Networking可能帶來的影響。去年的秋招,LinkedIn採用的是大量發return offer的方式招new grad,正常的申請連結根本就不開放。九月中旬的一天,晚上九點鐘,我找同學請教作業,對方回答「等等,我投完LinkedIn回覆你」,我一問她才知道,她在校車上聽到在LinkedIn實習的同學打聽到New Grad申請連結開了,投完立刻發OA。我正在猶豫要不要等兩天面經再投,另一個消息很靈通的同學跟我說「趕緊投,說不定過幾天就關了」。於是我趕緊去找內推,很快找到了願意幫忙的師兄,師兄說「我吃個晚飯就推你」。正在等師兄吃晚飯的時候,拿了LinkedIn return offer的同學又跟我說「別等內推趕緊投,名額可能很快就滿了。」於是我就咬咬牙,立刻海投簡歷並且做OA。等我凌晨一點做完OA的時候,連結就已經關了。
第二天去看這個申請的數據圖,一共開放了四個小時連結,收的簡歷有一半來自匹茲堡,另一半來自灣區,估計都是大家口耳相傳的。雖然我OA就沒過,但是有同學就通過這次海投拿到了Offer。
其他事項
凡事預則立,一定要好好利用大段假期(入學前、寒暑假)準備好材料和刷題。如果你能在入學前就認認真真刷了一百題,有什麼面試難得住你呢?
控制好面試時間,儘量在相近時間段(比如兩周內)大量投簡歷,然後把面試時間集中安排在兩周內,這樣大概率結果也會在兩周內先後出。這樣做一方面是方便自己空出時間,這兩個月全心全意找工作,另一方面拿到Offer之後也可以compete,有效避免撕Offer、籤完之後覺得工資低等無奈情況的出現。將求職期控制在三個月內,才能真正做到一鼓作氣,效率最高。
即使你做了所有能做的,Offer還是遲遲不來,此刻的你跟剛開始找工作的你也不可同日而語了。有沒有Offer只是一瞬間的事,厚積而薄發,要相信自己一定行!
真心祝福大家都能收到心儀的Offer!
除非有特別熟悉的語言,不然強烈建議刷題用python,寫題簡短,白板編程流暢
刷題另一高效刷法:與進度和目標類似的小夥伴一起刷題,經常討論。尤其如果有大佬願意跟你講題,一道題就可能受益匪淺。我很幸運,身邊的朋友水平都比我高 沒想清楚的題跟他們討論,不僅使人豁然開朗,甚至能達到領會一整個類型的題的效果!
ng 一枚, 刷題兩年, 斷斷續續, 目前為止總共刷了400+。對於面試中所有的medium題目, 基本都可以秒殺。2020 fall, 拿到了4個面試,3個onsite。只有第一個面試掛了(掛在面試技巧上面了),另外三個onsite全部拿到offer了。
個人的刷題路徑
1. 刷easy題。主要尋找做題的感覺。
2. 刷linkedlist, tree。原因一是面試中這兩類題考的頻率較高, 原因二是刷這兩類題有助於對遞歸的理解, 為後面刷DFS打下基礎。
3. 刷DFS。DFS非常重要,因為大部分 brute force 基本都可以用dfs來求解。剛開始刷DFS, 可以重點關注pemutation 和 combination的題目, leetcode 這兩類題也挺多的。然後開始總結, 去理解 「狀態(state)」 這個概念,對於每道DFS問題, 要清晰的定義出 「狀態(state)」, 以及狀態如何轉移, 這方面的基礎可以為DP打下基礎。
4. 記憶化搜索。也就是DFS + 記憶。記憶的存儲通常用map或者set即可。
5. DP。記憶化搜索刷熟了,可以嘗試開始刷經典的DP,理解狀態 和 狀態轉移,嘗試自己去寫出狀態轉移方程。嘗試DP的兩種實現方式 top-down(也就是記憶化搜索) 和 bottom-up
6. 高頻數據結構, stack, queue, heap。這三個數據結構在面試中出現頻率非常高。
7. 其他重點專題: sliding window, sort(特別是快速排序 和 歸併排序), two pointers, graph, bfs, trie, union find
個人的其他刷題方式,我通常會結合不同的刷題方式。
1. 只看題,不寫代碼。我通常會從brute force 開始求解, 然後逐步優化。如果10-20分鐘以內想不出解法, 直接去看答案了。
2. 對於一道題, 精耕細作, 舉一反三。精耕細作是指 學習優秀代碼, 一題多解 以及 如何從brute force推導到最優解,並且了解這個過程的思路是如何形成的。舉一反三是指看類似的題目, 總結共同特性。
3. 參加競賽。訓練快速做題, debug , 寫代碼的能力。
其他tips
1. 刷題初期追求量,一道題不可花太長時間, 控制在30分鐘以內
2. 最好不依賴IDE, 訓練直接在leetcode 頁面寫代碼。
3. 定期回過頭總結刷過的題。
4. 不要盲目刷題, 適可而止,刷夠了,要轉戰到面試技巧上面, 面試技巧和刷題一樣重要。(因為我就有一個面試掛在面試技巧上面, 非常後悔)
刷題感悟:理解 子問題。對於每一個問題, 定義子問題是什麼, 然後如何從子問題推導出原問題的解。對於DFS, 就是窮舉每個子問題。DP就是因為存在重疊子問題。貪心就是每次以子問題的最優解作為原問題的最優解。