加入極市專業CV交流群,與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度 等名校名企視覺開發者互動交流!
同時提供每月大咖直播分享、真實項目需求對接、乾貨資訊匯總,行業技術交流。關注 極市平臺 公眾號 ,回復 加群,立刻申請入群~
本文整理自知乎問答,僅用於學術分享,如有侵權,請聯繫後臺作刪文處理。作者|矽谷IT胖子
https://www.zhihu.com/question/32019460/answer/1214537663
刷完LeetCode != 會面試會面試 + 運氣 == 能拿到Offer
運氣(大勢)親手寫過這道題(Copy Paste不算)
在做完題後,短期(2天-1個月,因人天資、狀態而異)內不會忘記,但長期一定會忘記
別小看硬記層次。我相信很多進了一線大廠的人,刷LeetCode不過是硬記層次。有些人天資不適合理工和數學(比如我自己),但記憶力極佳,短期內能記住大量的東西。這對那種原題面試基本上是有非常大的優勢的,因為記得所有的關鍵邏輯甚至所有的edge case,不可能出bug,也就很難掛。但這種硬記層次最大的問題是:一旦面對題目的變體,比如Google面試,很容易抓瞎。因為是真的不會啊!後面還有Followup和擴展也很容易露餡。適合文科天資、強記憶力弱分析弱基礎的人
只要努力,回報特別明顯和直接
有些人是先記住,後面才理解的,硬記是一種學習方式,並非效率低
一旦考題靈活,很容易掛,成功率並不那麼高
時效性太強,施法前搖太高了
每次跳槽面試都這麼搞一把太累,而且傷腦子
任何時候,拿到這道題,都可以做出來,如果忘記了,也會自己推斷和分析出來。換句話說,面試基本上不會掛了(除非是被故意陰了)
真正理解了這道題背後所隱藏的邏輯、思想和算法,並且能夠擴展到類似其它問題,以及處理所有的followup
我很久以前面試時,一些題還處於「硬記」層次。這次疫情在家無聊,隨手做了幾道,發現幾年沒做題,有些題竟然自己進化到了「理解」層次。可見,我自己是典型的「先記再理解」的學習類型,也可能是工作強度高導致的個人能力上升。理解層次最重要的標誌就是不需要重新看題也能面試。這其實意義極大:「說走就走」,隨時可以面試,意味著根本不怕裁員、被開、經濟危機、組裡政治鬥爭,意味著一旦有更好的機會,基本上可以立刻去嘗試。而且,如果大多數題都到了理解層次,那麼面試的成功率也極其高,很可能是面5家拿到4個Offer這種。掌握就是不僅完全理解一道題,並且能給人講清楚,能把「純刷」、「硬記」層次的人,無論智商多少,都提升到「理解」層次。個人認為是沒必要修煉到的一個層次,用處不大。要知道題太多,有第三層次基本上面試都不會掛了,有這個時間還不如提升自己的系統設計能力,甚至工作和人際能力。綜合來說,「刷完」LeetCode,很多人只是停留在第一層次和第二層次,但如果大多數熱門題已經有第二層次了,也可勉強一戰,萬一混進大廠就舒服了對吧?這時候運氣和經濟是主導因素;到了第三層次,基本上無視經濟和運氣這些因素了,但個人覺得大部分天資普通的人都是在工作幾年後才(有時間、有耐性、有悟性)修煉到第三層次的,也不必強求。刷完LeetCode != 會面試最後來解釋這個。面試是一門學問、需要研究,這句話沒有實際意義,但我想說的是下一句:作出題不見得拿到Offer,這已經是業界共識。舉個簡單例子:很多人能作出題,但交流太爛,基礎太薄弱,稍微一問就露餡,就很容易掛。面試不是高考,沒有標準答案,沒有100%客觀的評判。所以,如果面試時100%的精力都在做題或是思考或是硬挖出最初的做法,很容易忽視交流和分析,從而交流上失分甚至掛掉。這也是為什麼我說「硬記」層次面試成功率並不高、而一旦到了「理解」層次幾乎很難掛的原因:在「理解」層次上,一個人的思維過程就是分析過程,只要同時說給面試官聽即可,同時順便自然地寫出代碼。換句話說,在這個層次,這人基本上只有50%的精力在考慮具體程序,50%的精力在分析和解說上,自然容易溝通;而「硬記」層次可能80%的精力都在回憶自己當時怎麼做的、應該怎麼解釋,所以面試官聽不懂,答案duang的一下就出來了,很突兀。那麼,如果不想花時間、只能達到「硬記」的層次,就要加強交流、演說方面的訓練。個人認為,交流不是口語、英文,這也是一大誤區。交流,是一種能力,怎麼用最簡單最實用的辦法,讓對方明白你的思路、推導和過程。很多美國人的交流也不行,雖然是母語,囉哩囉嗦地說一大堆,最後反而給人一種「這麼簡單的事情,話好多」的反感。交流的一個重要因素是,要跟別人在同一個平面:不僅僅要知道題的做法,還要知道別人一般是怎麼想的、怎麼能給他(她)解釋清楚。這樣看,面試又不簡單了:因為實戰中,最多只有50%-70%的精力在應付題本身,而平時做題是100%。所以,刷完LeetCode的人,很可能面試還不夠熟練,甚至還沒入門、還會犯低級錯誤。這也是我認為「刷完LeetCode != 會面試」的根本原因。當然,最後抬個槓,LeetCode不會刷「完」的,子子孫孫無窮匱也。1000多道題,最後只能讓第二層次「硬記」越來越困難,客觀上是逼迫所有人往第三層次「理解」發展的,即:LeetCode做完多少題,已經不是一個指標了;更關鍵的是,一個人「理解」了多少題。如果說對策,本文就太長了。我只能說刷題+實戰:刷題是基礎,實戰中提高技巧和交流,兩者循環往復,實力提高會很快。當然,累。作者|胡津銘
https://www.zhihu.com/question/32019460/answer/887877092
算法弱雞過來強答一下。
在LeetCode上前後一年多陸陸續續刷了760道題左右,基本上把大部分的免費題刷完了。
刷LeetCode之前的基礎:
本科非CS,與CS相關的課只有一門C++,跟過Coursera上的Algorithm課程,學過基本的數據結構。胡亂看過Algorithms的前幾章和CLRS書,前者跟著課看的話大部分能看懂,後者很多看不懂。掃過CLRS的一些習題但太菜了做不動。碩士轉了CS,也沒上過算法課和數據結構課,做的是機器學習方向。這時候做LeetCode上難一些的easy題就會很吃力,medium中比較簡單的題可能能做出來,hard一道都做不出。
刷LeetCode的方式:
先從Top100 liked 的tag開始刷(這個tag的題我刷了好幾遍)。刷完之後按topic的tag刷過一段時間,後來改成了選擇難度之後按順序刷。一開始就按照ac率從高到低亂刷,後面就只刷點讚比點踩多不少的題。有一段時間每周的周賽基本都參加,不過最後也就是2000分的水準,比較弱。我一道題如果較長時間想不出來(比如半小時到一小時),就會去看discussion,主要是太懶了不想動腦子。自己A了的題也會去看discussion,去學別人比較好的解法(後來是學寫法),然後自己照著敲一遍。不會或者不是最優解法的題,過一段時間如果記得的話就再做一遍,不過一般都是不記得了:(
刷LeetCode之後:
大概刷了400多道題之後開始找實習,這個時候的水準是hard多數做不出,medium基本都能做出。找實習的時候比較閒,大概面了10來家公司,吃到了hulu的拒信,其他的公司例如Google/MS/阿里/騰訊/頭條這些都算是比較輕鬆地拿到了offer。hulu的題當時確實就是做不出,實力不濟。然後後面比較閒又刷了些題,秋招開始的前一個月因為忙和懶就沒怎麼刷題練習了,這個時候的水準是hard能做出一部分吧。秋招面的公司不多,有Google/阿里/騰訊/頭條之類的,算法/研發崗都有投,都拿到了offer,國內企業的話給的都是ssp。就做題而言,個人感覺是外企hulu/airbnb的題不一定能做出來,國內的企業的話頭條的題可能會碰到些挑戰(據說很多創業公司/獨角獸公司的題很難,不過我全都沒投,就不知道怎麼樣了)。當然了,面試涉及的因素/能力很多,還有溝通交流、項目、其他cs/機器學習基礎等等,那就是另外一回事情了。我在Github上有寫一些這方面的總結,也寫了一些自己轉專業自學CS的心得,也歡迎參考~
tips for interview:
https://github.com/conanhujinming/tips_for_interview/blob/master/README-zh_CN.md
總結:
刷LeetCode儘量還是精刷。但即便你像我一樣基礎一般又懶得精刷,單純地堆砌題量也能搞定大部分公司出的題了。建議多做那種自己要費一些力氣才能做出來,但又不是完全做不出來的題,然後少做自己可以秒殺的題。可以找小夥伴組隊一起刷,相互督促鼓勵交流討論,共同進步~
作者|北南
https://www.zhihu.com/question/32019460/answer/1211129124
如果你是把目標定在了網際網路大廠,包括一些臨近上市的當紅炸子雞,那我覺得你不僅僅要題目「做的出來」, 更重要的是要能「說的明白」。
正所謂光說不練假把式,光練不說傻把式,又說又練才是真把式。
做的出來這一步我不多說了,幾個高贊回答都說的很好。做的出來是一切的基礎,是後續溝通的前提。
但「做的出來」不是最終目的,你面對的是一個有靈有肉的面試官,而不是自動測試的機器,否則一個leetcode這樣的系統不就可以取代面試官了?你的目的是讓對方喜歡你,是用「說」來讓對方知曉你的能力,也是用「說」來戰勝其他競爭者脫穎而出。那我就重點來說一下「說的明白」
1. 說清楚算法的時間複雜度和空間複雜度,這個很多算法會有平均情況和最差情況, 你也要討論清楚什麼時候會出現最差情況。
2. 說清楚各種邊界條件,要知道如何測試你的代碼。比如說對於輸入為空返回什麼等等。leetcode設計的那些test cases是這個網站價值的重中之重。
3. 說清楚算法的適用條件,也就是什麼時候這個算法才是正確的。比如說如果圖中有邊的長度是負值,那麼dijkstra算法還能用嗎?又比如說選取top k這種題會有好多種算法,它們之間的優劣又是怎麼樣的?在什麼情況下某種算法才是最優的?
4. 討論多線程或者分布式的情況。很多公司會在你題目做完後,給你幾個follow up。比如說就會問你,如果把你的算法放到100臺機器上,這個算法還成立嗎?要如何修改?
5. 討論極大數據量的情況。和第4點類似,比如說你做個排序,如果內存中放不下所有的元素,你如何處理?時間複雜度和空間複雜度又會有怎樣的變化?
以上是比較「硬」的「說的明白」,下面還有比較「軟」的「說的明白」。也就是現在HR們常說的軟技能。
1. 你是否能問對問題?
這裡既包括一些clarifying的問題, 也包括你是不是能合理的要到面試官的提示。
2. 你是否能說清楚你的思維過程?有邏輯,有條理,而不是給面試官感覺你事先看過答案。
有些朋友看完題上來第一句話就是「這題用DP」,你以為你在打ACM個人戰嗎?你不和你隊友說下思路嗎?難道不是先找一些子結構,裝模作樣的試試看,然後再說「這題可以用DP,元芳,你怎麼看」嗎?當然,你也不用太戲精,自然就好。
3. 你是否能接著面試官給的提示進行思考和討論,而不是固執己見。
關於這一點,我想很多朋友會看過一些面經,有時候候選人已經是給出最優解了,但是面試官會給出不同的意見,引導候選人去做一個其他的解法。這是為什麼?是面試官不知道最優解嗎?有這個可能,但也有可能是面試官通過這一點來和你溝通,看你如和應對。往往無視面試官意見的朋友,是不容易得到很好的反饋的。當然,我也不是說面試官說啥你都照做,因為可能因為你被面試官故意誤導或者他也真不會造成題目沒有及時做出來。如何說服對方,這就又是一門學問了。
4. 你是否能控制好時間,控制節奏,甚至引導面試官來到你更熟悉的領域。
其實軟的東西有很多,我以後還可以繼續補充。我說這些也不是嚇唬大家,讓大家焦慮,其實也沒必要焦慮,因為這些軟技能咱們大多數程式設計師都很一般,很少有特別好的。不管你是不是科班出身,學校也不教這個。但也正因為咱們都起點比較低,所以提升的空間才大,你稍微努力練習一下,就能有機會脫穎而出。
我建議:
找幾個朋友互相練習, 你要習慣在團隊裡工作
一邊刷題,一邊自言自語講自己的思路,自問自答
把自己做題和自言自語的視頻錄下來,像我這樣
我覺得如果你能把以上把握好,那麼你算法coding輪應該可以得到不錯的分數。可面試還有系統設計輪和behavior問題輪啊,這些怎麼辦?其實「說的明白」是相通的,面試不僅僅是知識水平的較量,同樣也是你和你未來同事的第一次合作,面試官和你心裡都會裝著同一個問題,你以後願意和這樣的一個人天天說話嗎?所以說呢,把「話」說好,會為你的面試加分不少。
https://www.youtube.com/watch%3Fv%3D7oJ-5CShtUQ
對於覺得學數據結構與算法有困難的朋友們,可以看看我這篇。少則得,多則惑。其實面試中絕大多數題目並不要你會太多高深的數據結構和算法,你把二叉樹和哈希表弄明白了,就可以搞定小一半題目了。
https://www.zhihu.com/question/303208441/answer/538071425
推薦閱讀
添加極市小助手微信(ID : cv-mart),備註:研究方向-姓名-學校/公司-城市(如:目標檢測-小極-北大-深圳),即可申請加入極市技術交流群,更有每月大咖直播分享、真實項目需求對接、求職內推、算法競賽、乾貨資訊匯總、行業技術交流,一起來讓思想之光照的更遠吧~
△長按添加極市小助手
△長按關注極市平臺,獲取最新CV乾貨
覺得有用麻煩給個在看啦~