國內應屆生是不是把Leetcode刷的滾瓜爛熟就能進google了?
樓主在計算機專業讀研。
據說G面試時不會考太難如ACM級別的題,是不是只要把Leetcode刷的滾瓜爛熟融會貫通就行了?先實習再轉正是不是很容易?身邊不少人都在刷題,大家水平都差不多,那最後會以什麼標準區分呢?而且據說女生面試更容易過,是真的么?
Leetcode 編程訓練
搬運一篇陳皓 @陳皓 寫的關於leetcode的文章,覺得寫的很中肯。
刷刷總是有好處的,演算法題不常做,一下子要拿起來確實會生疏。 所以不管能不能進google都可以長期保持一個做題的狀態。以個人經驗來看,工作中遇到的水貨太多,一個比一個說的精彩,然而真正能力過關的沒幾個。我沒見過隨手刷leetcode的高中生,対ACM大神也沒啥接觸,可能是我土鱉。----------------------------------------------------以下是粘貼原文:Leetcode這個網站上的題都是一些經典的公司用來面試應聘者的面試題,很多人通過刷這些題來應聘一些喜歡面試演算法的公司,比如:Google、微軟、Facebook、Amazon之類的這些公司,基本上是應試教育的功利主義。
我做這些題目的不是為了要去應聘這些公司,而是為了鍛煉一下自己的演算法和編程能力。因為我開始工作的時候基本沒有這樣的訓練演算法和編程的網站,除了大學裡的「演算法和數據結構」里的好些最基礎最基礎的知識,基本上沒有什麼訓練。所以,當我看到有人在做這些題的時候,我也蠢蠢欲動地想去刷一下。
於是,我花了3-4個月的業餘時間,我把Leetcode的154道題全部做完了。(這也是最近我沒有太多的時間來寫博客的原因,你可以看到我之前做的那個活動中有幾個演算法題來自於Leetcode)有人說我時間太多了,這裡聲明一下,我基本上都是利用了晚上10點以後的時間來做這些題的。
LeetCode的題大致分成兩類:
1)基礎演算法的知識。這些題裡面有大量的演算法題,解這些題都是有套路的,不是用遞歸(深度優先DFS,廣度優先BFS),就是要用動態規劃(Dynamic Programming),或是拆半查找(Binary Search),或是回溯(Back tracing),或是分治法(Divide and Conquer),還有大量的對樹,數組、鏈表、字元串和hash表的操作。通過做這些題能讓你對這些最基礎的演算法的思路有非常紮實的了解和訓練。對我而言,Dynamic Programming 是我的短板,尤其是一些比較複雜的問題,在推導遞推公式上總是有思維的缺陷(數學是我的硬傷),通過做了這些題後,我能感到我在DP的思路上有了很大的收穫。
2)編程題。比如:atoi,strstr,add two num,括弧匹配,字元串乘法,通配符匹配,文件路徑簡化,Text Justification,反轉單詞等等,這些題的Edge Case, Corner Case有很多。這些題需要你想清楚了再干,只要你稍有疏忽,就會有幾個case讓你痛不欲生,而且一不小心就會讓你的代碼會寫得又臭又長,無法閱讀。通過做這些題,可以非常好的訓練你對各種情況的考慮,以及你對程序代碼組織的掌控(其實就是其中的狀態變數)。還記得我在《函數式編程》中說的,程序中的狀態是你程序變得複雜難維護的直接原因。
我覺得每個程序員都應該花時間和精力做這些題,因為你會從這些題中得到很大的收益。做完這些題後你一定會明白下面幾個道理:
1)想清楚了再干。這個觀點我以前就在《多些時間可以少些代碼》說過。如果你拿到題就上去直接寫代碼的話,你一定會被各種case打回來了。然後呢,你一著急,你就會進入那種我在《開發團隊的效率》中說的那種毫無效率case by case的開發模式,而你也進入了「平庸模式」。於是你就會出現下圖那樣的情況。
Case-by-Case Development
2) 編程是腦力勞動,急不得。這個事情在這做這些題的時候你就會發現,要麼是腦子轉不過來了,要麼就是明明就差一點了,但程序怎麼都調不對。如果你越著急的話,你就會發現你會離目標越遠,而花的時間也會更多。另外,你會發現這些題基本上都是50行代碼內就可以搞定的,但是為了這50行以內的代碼,你要花好多時間和精力。coding 50行代碼在我們的日常工作中分分鐘就完成,而Leetcode里的50行代碼卻沒那麼簡單,也許,用這個你就可以區別什麼是碼農,什麼是程序員了。
3)加班要不得。因為我總是在晚上10點以後做題,所以,基本上都是在加班狀態中工作。這種狀態過上兩三天,你就會發現,整個大腦已經不轉了,而且不但不轉,還會犯很多低級錯誤,很多事情都想不清楚,一個晚上都在和程序的狀態控制做搏鬥,代碼寫得越來越亂,越來越沒條理。於是這種時候,我都會休息幾天,不做題了,然後再做題的時候,就覺得非常地清楚。可見加班 是編程最致命的敵人!
我把我的C++代碼放到了Github上,大家也幫我review一下,看看有沒有可以改善的。
haoel/leetcode
好了,不多說了,我希望大家有時間都去練練LeetCode,無論是找工作還是對你的編程能力會有非常大的提高。
(全文完)
國內名額少,每年acm金牌還有幾十個陪你一起競爭,have fun (?????)っ
刷題,系統設計這些都是基本功。
求職是個系統工程。需要選擇合適的recruiter,內部推薦人,恰當的時機等。還有很多個人難以控制的因素,就用運氣來概括好了。
多和現職員工搞好關係有很大幫助。誰告訴你google面試官只問Leetcode的題了……
可能是我表述得不好,有人有些誤解。
我想說明的是leetcode真的什麼都代表不了,要想在大批競爭者中脫穎而出,要有拿得出手的貨。演算法刷再熟悉,一來前幾輪本來就沒有很深的演算法強度,而來真考強度了你也干不過一幫受過競賽訓練的傢伙們。
要去FLAG的中國人,是要求有演算法基礎,也確實會考核,但是並不是說刷完leet就行了。學演算法刷leet無可厚非,覺得刷完就穩了才是大錯特錯。如果你覺得演算法這一塊確實幹不過受訓練的人,那麼在掌握基礎演算法的前提下,儘可能去提升一下別的方面,例如工程經驗,例如數學。
不過也別太看扁搞ACM的那撥人,他們搞ACM好,並不是只能做做競賽題,人家同樣可以有足夠的工程經驗。搞清楚你要競爭的對手,然後發揮自己的長處就好。
—————————
刷完有卵用……刷完有用的話,就leet的難度和題目量,三百來個題就算刷再慢,一天10個題,也就一個月的事,這樣就能進Google,豈不是爛大街?MS也好Google也罷,你需要跟其他人競爭崗位的。考個演算法題很大部分的意義在於,當需要考慮保留你還是一個跟你差不多的人的時候,你做不出來而別人做出來了,用人方更方便找個理由拒你而已。
——————————
好像不少人不相信一個受過此類訓練的人刷leet的速度?一副看你吹的樣子……
寫到此處時為1月20日。除了付費題,我沒付錢以外,其餘題目都是順序刷過來的(還有個241是剛用leet時之前隨機刷的)。到這裡總共也就刷了兩個周末共計四天而已。本人碩士畢業都兩年了,脫離ACM都四年多快五年了,要說刷題能力早退化了許多,只是說leet的題目只是如此這般而已。
本周末如果時間沒問題的話,來一輪,到時候發提交記錄便是。並不是。因為Google有規定,國內的應屆生必須參與國內的競爭,但是國內的Google和從國內來矽谷的就那麼點人,所以沒戲。就算你要來矽谷,也得跟國內的人競爭,而不是跟在美國的人競爭。天知道他們為什麼要這麼設置。
可以這麼說,但要看你怎麼刷,以及什麼就是滾瓜爛熟。展開說一下:
轉專業去cs. lc正做第二遍. 第一遍儘力獨立完成, 每道題目一開始不會做的話, 不想個一天半天不看答案, 所以斷斷續續做了有大半年,平均一天也就一兩道題目. 第一次結束後, 每道題起碼有了自己的認知, 思路和寫法.
現在在做第二次, 我著重追求思路以及代碼的清晰, 簡潔, 和高效. 這時候閉門造車估計就行不通了, 所以我每題都做完以後, 如果代碼特別長, 或者運行時間的分布比較靠後(這往往意味著你的演算法不是最優. 如果你的演算法沒問題而實現不一定是最優, 你的耗時分布一定會在落在主流區間.), 我就會去discuss看看得票最高的幾個答案, 看看別人有沒有更好的演算法, 更好的實現, 然後我看一遍, 理解了, 再自己實現一次, 所謂追求更簡潔優雅的演算法和實現是也.
在這裡我的體會是, 不要以為別人的代碼短是偶然的. 這往往體現了作者紮實的基本功, 良好的抽象能力, 和對經典演算法的熟練掌握. 就拿我自己的例子來說, 同樣的題目, 第一次我可能要寫五六十行, 第二次我再寫, 可能只要十幾二十行就可以搞定. 擼代碼也是一項手藝, 需要錘鍊.
在進行第二遍的同時, 我還會弄一個錯題本, 把我忘記怎麼做的, 做錯的, 做得坑坑巴巴還是不熟練的, 以及演算法或實現依舊不是很好的題目記下來, 並註明失誤的關鍵所在, 以期待下一遍重點練習.
有的同學可能會說, 都是大學生研究生了, 怎麼還搞高中生這一套?我想說的是, 面試就像高考, 是目前最優的選拔手段. 高考考什麼?當然考智商, 考心態, 但最重要的是考一個基本功, 熟練度. 事實上智商和創新在高考中並不重要, 而心態可以通過基本功和熟練度的提升而改善, 所以總結起來就是六個字, 基本功 , 熟練度. 刷lc也是如此.
未來我的第三周目lc可能就是對著錯題本刷了. 刷完這三次, 我覺得我才能說基本有譜. 至於題主說的滾瓜爛熟, 我覺得每一題你都挑戰一下最短耗時和最短實現之後, 再來談吧.
最後我想說, 我知道刷完lc其實並沒有什麼意義... 但它是我實現目標的路上的一個巨大的(甚至是主要的)障礙, 我就必須要拿下它. 其他的可以再議.
知乎cs大神acm大神太多, 匿了. 只是一個轉專業的三本院校(知名校友曾老師)學渣, 感慨一下.
國內應屆生是不是把Leetcode刷的滾瓜爛熟就能進google了?
不是。最大的問題,在於你從哪兒面。國內的同學,只能在國內面,號稱Top 10的幾十所高校,裡面的上千計算機系畢業生,競爭100-150個名額。國外的同學,G給的名額多,面的簡單,拿G的offer,就跟國內拿個BAT一樣,average水平就能搞定。況且國外最優秀的人,近些年prefer Uber這種hot start up,並不是都想去G.@vczh "就算你要來矽谷,也得跟國內的人競爭,而不是跟在美國的人競爭。天知道他們為什麼要這麼設置",跟國內的高考,保護本地生源,一個道理唄。名額公平給外地人,本地人還不要造反。據說G面試時不會考太難如ACM級別的題,是不是只要把Leetcode刷的滾瓜爛熟融會貫通就行了?
G在美國面試,確實不會考太難。在中國面試,考的難,題目設計很巧妙,沒有滿足面試官心中的複雜度標準,他會笑著把你掛了。設計巧妙的題目,很多都會避開leetcode,所以只能靠聰明才智。我同學也碰到過寫上百行的系統設計題,這個leetcode中也學不會。所以:ACM經歷,對面G很有幫助,ACM鍛煉快速切各種各樣稀奇古怪的題,這個光刷leetcode是學不會的。
先實習再轉正是不是很容易?
國內實習offer比正職offer更難拿,因為實習招的少;國外實習offer,拿著跟玩一樣容易。身邊不少人都在刷題,大家水平都差不多,那最後會以什麼標準區分呢?
給你一道問題,一張白板,你能白板上一次寫成,完全正確,中途不改動,複雜度滿足要求,代碼風格良好。扣分的地方:0. 全錯了/邊界錯了/大數據錯了……1. 複雜度高2. 中途改動,比如寫一行,擦兩行3. 中途停頓太久,顯得思路不清晰
4. 代碼風格不好5. 寫之前,構思的時間太長………而且據說女生面試更容易過,是真的么?
長得好看更容易過,否則應該統一標準總結:假如沒有保護本地生源,面G很容易。不過既然保護,那隻能乖乖玩它的遊戲,要麼出國念書開啟easy模式,要麼刷leetcode之餘,刷刷別的題目,各種題目都刷的熟練,然後盡人事聽天命。答案當然是不行。你要是覺得leetcode難,就說明你演算法和數據結構不紮實,要補,補好了當然能提高你進某個公司的幾率,但誰能保證呢?
你要是跟那些ACM大神一樣,覺得Leetcode巨簡單,那其實也不用刷了。都會了刷了還有啥提高呢。
但是問這種問題的人,基本上最後沒有誰能刷的滾瓜爛熟的。因為他們基本上最後沒有刷完,就算刷完了。也沒有誰滾瓜爛熟。
GRE作文題庫才多少題。不要說寫一遍,有多少人把題目看的滾瓜爛熟?
要你命3000才多少單詞?一天100個30天就可以滾瓜爛熟了呀,無腦背哦。事實上,面試也就是個選拔,北美需求量大,競爭者少,選拔的bar就低, 公司只考簡單的演算法和設計,也足夠他們選出普通碼農了,bar再高。。招不夠人啊。
國內要是一樣的難度,選出來的人就太多啦~裝不下啦。你準備面試,無非是一個提高自己的過程,不要總想著投機取巧。其他人說的不重複了。針對樓主的問題說幾點:
1. Leetcode上現在300多題,已經不是啥三個周末能刷完的數量----我的意思是,刷的人多,刷完的不多,二周目的更少。我在另一個類似問題也說過,這就像減肥和健身,堅持下來的很少。2. 樓主水「水平都差不多」這判斷哪裡來的?看看leetcode的discuss,同樣思路的實現千差萬別,這還是大家覺得自己滿意才發出來,更別說無數沒有發出來的。
3. 我沒見過聽過沒有參加過acm/noi等比賽的人說leetcode很簡單沒意義的,知乎上類似問題有好幾個,所有出來說刷leetcode沒意思的無一不在最後或哪裡表明自己玩過的acm/oi要難多了。。。well, 這只是他們刷得早刷得更多罷了,反而正好說明從lc刷起是必要的。poj上面的題我做過一些,主要是錯誤要自己猜很煩,難度和lc hard差不太多。
4. 很多人一說就是國內難度高,國內如果考的演算法題難度跟矽谷一樣那就太簡單了太多人能進去了----這簡直是最好的「倖存者偏見」案例---說這些話的人你們自己看看,一般都是上面提到的自己在acm/oi圈混的,他們的朋友本身就是狂刷acm的刷題狂人,然後這幫人就以為中國大部分大學生「即使沒那麼強,也差不到哪裡去」---切,我會給你們說前兩年我創業招人時就一個reverse linkedlist就掛死無數211本科計算機學生么?再說了,coding question只是一部分啊,我的天,反覆強調了,通過whiteboard是必要條件,但是你一個刷得再好的,分不清楚tcp/udp搞不明白mutex/spinlock不明白web browser怎麼工作也講不出自己在一個project中具體完成了哪些工作的。。。呵呵。。。
總結:對沒有競賽基礎的,刷完leetcode才有資格達到flg的bar, 但這只是滿足了一個條件而已。
************************************說到 leetcode vs poj的話,其實我覺得有點意思,這就好像是engineer vs 純刷題的結果,看看兩者的使用感受和設計。。。poj那ui是人用的么。。。居然熬了這麼多年了。。。有那樣的題庫,做什麼不行。。。*************************************沒法,我等俗人為了能在flg campus裡面和acm大神喝咖啡,只有搞題海了。這程序員的鄙視鏈。。。不刷題的被刷了lc的看不起(覺得懶),刷lc的被刷過acm的看不起(覺得笨),刷acm的又被高中就刷noi等等的看不起(覺得不夠難)。。。whatever啦能把 xxcode 都背下來也是一種能力。你可以試試。不過 Google 肯定會出你沒見過的題就是了。
學法律的怎麼才能進入到Oracle供職呢?
LC刷完只能說過前一兩輪沒問題,後面的幾輪我覺得還是看積累……
實習過程中如果做的好,確實有優勢(我只面了兩輪,貌似比別人少)你以為不考ACM題就不會難哭么……G家有女性工程師計劃,外企的話好像有不少類似的國內不知道啥情況,矽谷靠刷題進intern pool足以,周圍好幾個都是這樣的,只是刷題不保證能match上,match還是需要靠PhD/project等。p.s. 一直覺得面試演算法是行業的奇葩,有多少行業面試和實際工作內容毫無關係的?p.p.s ACM/IMO金牌如果不去讀PhD那幹嘛去Google;出來工作目的之一就是錢,當然還是unicorn更有誘惑力。p.p.p.s. 勸那些有金牌的還是趕緊transfer到MIT大技校去,出來搞金融也成。
女生面試更容易通過=女生水平和男生差不多的情況下,那麼優先女生,不要誤會了
利益相關:男,愛好女
反著來一個個回答:1. 女生通過面試不會更簡單。最喜歡刷掉自認為女生回答差一點準備少一點也可以的面試者了。不能拿性別當優勢,一點都不Googley。2. 題目只是其中一點,當然是最重要的一點。若是稱讚女面試官去「漂亮的不像工程師」,就去等著被拉黑吧。
3. 實習轉正的人很多,但實習轉正並不會更簡單。因為實習名額少,拿的都是好苗子。
4. 刷得滾瓜爛熟融會貫通就可以了。大部分面試者根本刷不到達標的題目量。就我面試的經驗最難的題超過Leetcode hard另外有個牛逼的簡歷非常非常重要 否則你過了面試也沒有組要你所以刷題什麼的差不多就行了 努力提高自己的技術積累才是硬道理講道理的話 年景好的時候阿貓阿狗都能混進Google 但是混進去了又怎麼樣呢?只有持之以恆地提高自己才能走的更遠身邊有同學刷題非常努力 他也順利地進入了谷歌實習 但最後因為實踐能力不行沒有拿到return
不是,首先要有一份不錯的簡歷,然後刷題很重要,有時候難度會大於leetcode,大概難度在codeforces div1 AB題,寫代碼的時候盡量不要寫出來bug,寫出來的話會被說代碼不穩定。給面試官講一遍code,面試轉正不光面演算法的,還會問些其他的,有system design這種題,面試如果水平差不多,確實更傾向於要女生,先實習後轉正是比較容易,但是如果你實習的老闆給寫一個負面的評價,那轉正可能就沒戲了。。
首先刷題就面試來說肯定是有用的。比如你可以看看這個《Google歷年面試真題題庫》,不難發現面試中會有很多原題。如果覺得看Leetcode上純英文的題目有點吃力的話,可以去試試Lintcode,有中文模式,題目相對多一點,分類也比較清晰。
但是並不是說把Lintcode/Leetcode刷得滾瓜爛熟就能成功面試進Google了,從來沒人說過Google只問Lintcode/Leetcode上的題目,求職準備也是有很多的。
1.代碼的學習。題主已經說到自己在讀研了,基本知識應該都很牢固了。但是學無止境,想進Google這樣的大公司根本不是刷刷題、有個學位證就可以的,在學習上一點都不可以放鬆。在以後的工作里,你以前所學到的將會一直受用。
2.項目。項目經驗也很重要,你簡歷如果沒有一點點項目經驗,即使你能把Lintcode/Leetcode刷得滾瓜爛熟也顯得很蒼白,這最多能讓你表現得演算法不錯而已。有空的話多上GitHub學習實踐交流是個很不錯的選擇。
3.面試準備。如果你不善言辭,不能很好的和面試官交流,他們可能就會懷疑你工作時到底能不能很好的和團隊一起合作項目。如果覺得自己人際交流這方面有點薄弱的話,一定要看看《程序員面試指南大全》 ,以提高面試中的應變能力,為自己爭取最大的可能,不要以為程序員光會敲代碼就ok了。
4.運氣。不管是進google還是什麼公司,成不成功還有一個玄學因素就是運氣。所以即使失敗了也不要氣餒,多去嘗試,總能找到屬於自己的那條光明大道。
準備面試是一個提升自己的過程,不要將其定在一個功利性的位置上。也不要把自己的人設定在谷歌的SE,相反,是要把自己定在一名優秀的軟體開發者。當你足夠優秀的時候谷歌還會在半路找到你並向你提出邀請。
細究起來,這個問題有很多漏洞。
刷題也是有技巧的
有人可能又會說了,刷題有什麼技巧,不就是做題嘛。其實刷題也是有一定技巧的,在短時間內重點鞏固弱項,比如說在全面開始刷題之前,先做一套《Google在線模擬測試題》,然後針對自己的問題復盤之後找對應的類似題目反覆鞏固,在LEETCODE/LINTCODE 標準答案查詢上搜索解題答案和思路,分析題目考察的點到底是什麼,深挖重點題型。不求量,不求速度,而是注重質量。
面試並非只考題目
有的人可能會說,面試不就是面試官問問題,然後回答,這不就是題目嘛,既然是題目,就可以通過刷題庫的題海戰術來解決。其實這麼想就犯了一個高中生學習容易犯的錯誤,單純只看題目,其實有的題目不一定需要完完整整解出來,有的題目也許是面試官工作中遇到了一個問題,實習生根本沒聽說過,有的題目根本就是個大框架。所以說面試並非只考題目的意思其實是,面試考察的除了解題,還有思維能力、學習及工作態度、執行能力、協調配合能力,甚至是面對危機的應變反應能力,這些通過《Google面試備戰指南》一文就可以看出來了。
說了這麼多,應該能夠看出來,這裡的回答的觀點是想要進Google不能只是單純靠刷題。如果進入一家世界級大企業僅僅靠刷題就行,那麼是不是所有程序員只要能堅持刷題都能進?
實踐
沒有實踐過,所有的知識和刷的題目都是紙上談兵。在這方面可以從簡單的實習工作做起,或者可以組織幾個好友一起嘗試做一個項目,想要進入Google,至少要有一個以上的實際項目操作經驗。不然,等到面試的時候,面試官所問的問題稍微涉及到一點實際操作,你就一臉懵逼不知所云,換作一家小公司可能會要你,但是google絕對不會選擇你。
面試技巧
進入Google除了需要過硬的編程實力,其他方面,交流溝通、復盤反饋、拓展思維、創新能力都很重要,所以在面試前很有必要著重鍛煉一下這方面的能力技巧,可以看一看《Coding 面試如何與面試官溝通?》、《如何進入 Google 工作》 這些文章,以便更加自如的應變面試官拋出的問題。
推薦閱讀:
※下一個即將火爆的行業有沒有可能是傳遞溫暖的暖床服務?
※接私活結果最後錢要不回來該怎麼辦?
※為什麼很多網頁、圖片、視頻,都在我失去耐心、選擇退出的那一瞬間,剛好載入出來?
※怎樣看待「信息不對稱」?
TAG:互聯網 | 微軟Microsoft | 求職 | 演算法 | 谷歌Google |