刷 LeetCode 吃力正常嗎?
鏈接:https://www.zhihu.com/question/31092580 編輯:深度學習與計算機視覺 聲明:僅做學術分享,侵刪
https://www.zhihu.com/question/31092580/answer/54194793
大多數(shù)的 hard 都是特定領域的問題,如TCP的滑動窗口,編輯距離等。這些如果之前沒有做過, 是很難獨立完成的。我遇到問題的時候一般到?水中的魚?找答案。這個博主是 facebook 的工程的,但有些題目他也沒法立即想到答案或者最優(yōu)解。所以別太灰心,好好做,會有收獲的。
上個圖說明我刷得很艱難。。

https://www.zhihu.com/question/31092580/answer/1014282264
Easy 的題目是不用思考就可以說出來答案的,但實際寫的話還是要認真檢查各種 corner case 有沒有處理好,否則一不小心就有 bug,無法一次提交通過。
Medium 的題目有幾種不同的情況,有些是問題比較難解決,有些是代碼寫起來超級復雜。對于前者,會需要花一定的時間想想怎么解,有可能能把題目轉(zhuǎn)化為其它已經(jīng)已經(jīng)做過的題目。對于后者,需要花時間思考怎樣寫的代碼能夠覆蓋所有 corner cases 但又 maintainable,而且寫完不仔細檢查很容易在某些地方留下小 bug,就變成了要通過多次提交來排 bug。
Hard 的題目就隨緣吧,反正大概有一半是做不出來的。
「必須要有真實前端經(jīng)驗」是什么意思呢?例如說在大多數(shù) JavaScript 引擎里面,比較兩個字符串是否相等是 O(1) 而不是 O(n) 的操作,這個你知道就是知道,不知道就是不知道。如果你做過 JavaScript 性能優(yōu)化,或者至少是做過性能分析來找瓶頸,那你很有可能遇到過這類問題從而知道這一點。
不過有一個事情是這樣子的:其實在面試時,你不一定要做到最優(yōu)解,你可以有些小 bug 但最好你自己能檢查出來然后改對。(面試更看重的是跟面試官一起解題的能力,而不是獨自一個人寫出完美解的能力。很多人理解不到這一點,因為這跟學校的考試規(guī)則完全不一樣。細節(jié)參考我其它答案。)所以在訓練時對你自己要求更高一些,到面試時就可以放松做。
總之這個事情你可以理解為跟訓練跑馬拉松差不多。今時今日已經(jīng)有很科學的馬拉松訓練方法,能讓絕大多數(shù)人在一個月到幾個月的時間內(nèi)從零開始訓練到能夠跑完馬拉松(合理時間內(nèi)跑完)。這個過程大多數(shù)人只有有意志力都能堅持下來,但不代表它不痛苦。
https://www.zhihu.com/question/31092580/answer/477447691
每道題要有time constraint。大部分oj的題目如果需要想+寫超過半小時,那就等于完全不會。實際面試中(任何考試中),你碰到的題目是不可能讓你做超過1天的。所以每道題必須掐時間做,做不出來直接看答案,之后碼一遍AC的代碼。第二天重新做?。。?/span>
大部分Hard難度的題、brain teaser,個人以為是面試的幫助都不大。因為刷題的目的不是碰到原題,而是解決思路相似的題目。LeetCode hard難度題目難度遠大于個人面FG new grad時候的題目難度。實際上FG new grad的phone interview 以及onsite難度個人以為屬于medium里面比較容易的。
難以復現(xiàn)(以類似思路出現(xiàn))的題目看看就好了。2里面的題目個人就是屬于這種情況,個人認為easy里面一些math的題目,都基本不具有參考價值。
除了題目里面的算法內(nèi)容,刷題還是需要注意些基本編程規(guī)范的,畢竟大部分公司面試都不會只讓你寫pseudo code。注意programming to interface之類的準則,因為面試里面會問到!
學好英語
個人背景:本科非CS,研究生CS。LeetCode刷了500道題左右,刷了5-6遍,第一次刷的時候一天做題加看答案只能做20道題。最后兩遍刷的時候,weekly contest的medium可能就要5-10分鐘。到這個程度的時候個人認為onsite的算法題已經(jīng)不是任何問題了,F(xiàn)G的面試很隨意了。
https://www.zhihu.com/question/31092580/answer/742703012
LeetCode實習生,想分享自己一點經(jīng)驗,讓你們少走一點彎路!還有, 我不是大神, 只是喜歡敲LeetCode的小學生!首先, 大多人說自己沒有編程基礎,?LeetCode太費力!其實這個完全不用擔心, 因為我就是零基礎,在敲LeetCode甚至連一門編程語言都沒學過(只會一點python)!什么BFS,DFS,動態(tài)規(guī)劃。。。什么都不懂!LeetCode還是通過我找工作小伙伴知道的, 之后一發(fā)不可收拾。所以沒有編程基礎完全可以刷,但是要掌握一些方法(后面我會介紹)。
其次, 敲LeetCode沒用, 還是找不到工作;能不能找到工作我不知道,但是我確確實實從中得到一些好處,把它用于生活中。
獨立解決問題能力,編程能力相當與解決問題能力, 長時間編程能力的鍛煉, 可以提高解決問題的能力。生活中也會遇到困難, 我總會習慣性去想辦法解決, 相信方法總比困難多。
思維能力, 編程時候我們要把所有可能性想到,會有好多邊界情況, 需要考慮極端情況;這個思維也可以用在生活中,我會下意識想到這個問題發(fā)展最好情況,最差情況。。。想辦法解決各種情況,所以考慮問題會很全面,做起事來游刃有余。
專注能力,現(xiàn)在是娛樂至死的時代,能靜下心做的事越來越少。當你做題思考時候,你必須要沉靜其中,讓心流遍布全身,那種感覺真的很舒服!這種快樂不是那些及時快樂相比的?,F(xiàn)在最值錢的不是時間,不是金錢,而是你的專注力。資本剝削就是剝削你的專注力...反正專注能力很重要,值得鍛煉。
時間空間, 編程時候我們總是盡可能節(jié)省空間, 時間做到一點也不浪費!在生活中, 你也會無意識去思考這些, 讓自己更快,更好完成它。如何用空間換時間,用時間換空間?相對于最少資源得到最大利益,讓自己生活飛起來。
還有,很多很多。。。
最后,還要人說LeetCode太難了, 自己太笨做不了。天賦決定上限,努力決定下限。先努力做到目前你能做到的最好,然后再說不行。要相信一萬小時定律,傻子都能成為天才。我們先試一試->不行->再堅持一下->不行->再堅持一下->不行->放棄!做點其他想做的事,人生其實就是在不斷的嘗試,才能找到自己想走的路。開心才是最重要的,改變世界就是那幾個人,大多數(shù)人渺小到可有可無,我們能做到就是讓自己開心,讓自己生活有意義!
LeetCode方法,大家可以借鑒。我采取的方法
快刀斬亂碼 慢工出細活 堅持
第一步, 快刀斬亂碼
LeetCode標簽每種類型做個幾題。一開始不知道怎么做,沒事!思考十分鐘, 想不出來直接看別人代碼, 把它的邏輯搞清楚。然后自己手敲一遍(不看他人代碼, 自己想邏輯)。這個很關鍵!不去思考,看著別人代碼敲, 只能練手速, 該不會還是不會!第二步, 慢工出細活
第三, 最重要堅持
LeetCode,每天兩題,一開始需要4,5個小時,隨著你每天練習,時間慢慢變短,而且肉眼感受到自己的進步!很有成就感!人只所以堅持, 是他認為有意義, 把敲LeetCode賦予重大意義, 每個人都可以!再寫一點建議,
LeetCode都是水題,可能一輩子我也達到不了這種水平, 但是每天讓自己大腦處于思考情況, 做事邏輯清楚,還有它給我?guī)韮?nèi)心平靜,感覺世界很靜,自己很舒服!其實就夠了!我們在敲的時候,養(yǎng)成一些好習慣。我們畢竟不是acmer, 不需要刻意追求速度, 養(yǎng)成見名知意變量命名習慣;養(yǎng)成寫注釋的習慣;養(yǎng)成估算自己算法時間復雜度,空間復雜度(我還要鍛煉)習慣;。。。。別看這些一開始很難, 當你養(yǎng)成習慣了,以后都是無腦事情,一點也不累!
真的希望大家, 不是為了面試而找敲算法,而是培養(yǎng)自己喜歡思考的習慣!讓自己一直處于進步狀態(tài)!算法不僅僅只屬于計算機,生活中處處都能看到, 你玩的拼圖游戲(DFS)。。。都是算法.
https://www.zhihu.com/question/31092580/answer/487445817
第一遍刷的什么都沒記住,花了半年。
第二遍研究生入學刷的,有的題感覺都沒見過,剩下的有印象,但是我發(fā)現(xiàn)我的解法和第一次都差不多。中間面了微軟on campus掛了,是真的菜啊。
第三遍是拿了Google面試,只刷狗家tag下邊的題,高頻題刷了兩遍,面經(jīng)又過了一遍,背靠背第二面咖喱英語的follow-up沒聽懂,掛了,很氣。
后來面Facebook,那時候tag有128道題,我刷了108道,保守估計每道題3遍,包括手打兩遍,白紙一遍。沒有遇到一個國人面試官,一面電面,美國人,兩道m(xù)edium,二面onsite三道題,因為我說我見過3sum,面試官在我說完思路之后就換題了 。過了。
后來我?guī)蛣e人mock,真的很急,挑的easy和medium,要么給的不是最優(yōu)解,要么卡在代碼實現(xiàn)細節(jié)里。
個人認為:
作者:糖長老
https://www.zhihu.com/question/31092580/answer/441049272
刷leetcode最好的方法就是給自己定個時間,超過了就果斷看答案,理接答案,按照答案的思路自己編一遍。剛開始刷leetcode重點不在于獨立解題,而在于迅速把所有的題刷三到四遍,后面遇到新題就自然會有思路,可以迎刃而解了。
所謂書讀百遍,其義自見,說的是很有道理的。其實這也是學習進入一個新的領域的最有效方法。
https://www.zhihu.com/question/31092580/answer/618541259
一開始必然拼寫錯誤,數(shù)據(jù)測試不通過啥的。慢慢校正,無疑是對python語言的一個鞏固,也被坑了無數(shù)次邊界檢查。
后來,驚訝于python如此作弊的函數(shù)與方法,迭代器啊,列表方法啊,字典啊,通過看《Python基礎教程》學到了很多。
再后來,看了不少大佬們的解答,知道自己比較欠缺的是數(shù)據(jù)結構還有算法。借了一本很簡單的書,簡單體會了比如分治還有動態(tài)規(guī)劃,然后盯著DP標簽的題做,突然有一天似乎明白了這種思想的含義,真是體會到了什么叫醍醐灌頂。數(shù)據(jù)結構中的鏈表和二叉數(shù)也是,在明白了python如何模擬數(shù)據(jù)結構(這是我在測試界面看到了網(wǎng)站幫我們寫好的代碼,才整明白的),又學了點數(shù)據(jù)結構后,刷起專題來還是很爽的。
目前就到這個階段,還沒有說看到題能感受到用啥方法的地步,效率也是個渣,每周競賽那時也做,只能做前兩道的渣渣水平。另外用python不少時候能作弊,再用一門語言二刷很有必要啊。
吃力,相當正常,不過個人有幾個渣方法:
有一門叫熟練的語言是很重要的,如果語言,數(shù)據(jù)結構,算法都不熟練,刷Leetcode會有不小的難度。個人推薦python開始,好用一點,不被某些語言上的東西困住。
實在想不出的題看答案也可以,不過多看幾個答案,多琢磨,哦!這個想法真的很妙??!以后也能用上!如果程序通過但效率不行,也可以看其他人的算法,或許是習慣問題,或許是更好的算法。
https://www.zhihu.com/question/31092580/answer/562179059
有些算法思路你不熟悉的話,根本想不出了,想出來也寫不出來,寫出來也過不了,過得了也不一定是最優(yōu)的,真的慘。
不過后期看到新題目真的會有一些思路的,實現(xiàn)能力也變強了,最差也能搞個暴搜出來。
對于研發(fā)和算法的同學來說,刷題的重要性不言而喻,不刷提你好意思面試么,我自己只是大學學過C語言課,早忘了。三月開始刷題真的是0基礎(不過我的編程思路邏輯還是可以的),分享一下刷題的步驟:
打地基階段:
入門階段:
目標:算法思想細節(jié)要搞清楚,實現(xiàn)的一些細節(jié)也要懂,最好對著代碼一行一行走幾遍。你也許會對很多實現(xiàn)細節(jié)不清楚,沒關系,多寫,多畫。
資料:劍指offer,大話數(shù)據(jù)結構(這個選擇著看吧 說的太啰嗦了),leetcode easy的題。
跑步前進階段:
抱佛腳階段:
刷題的原則就是,廣度要夠,不要死盯著一個不放。
來源:深度學習與計算機視覺
本文版權歸原作者所有,如有問題請聯(lián)系我刪除。

