1024,给大家谈谈如何搞透刷题 玩转力扣!
前言
大家好,我是bigsai,好久不見(jiàn)!今天1024,祝大家程序員節(jié)快樂(lè),寫(xiě)代碼永沒(méi)bug!今天就給各位小伙伴分享我自己刷題力扣的一些小方法,不一定很有用但是可以參考,祝你更高效的變強(qiáng)!
最近在一些群聊、私聊中遇到很多的一個(gè)問(wèn)題就是:刷題,大家也都重視到算法刷題對(duì)沖擊大廠的重要性,越來(lái)越多的人開(kāi)始卷起來(lái)了!
但有的人是這樣卷起來(lái)的,卷的自己都懵了。
今天,我就給偏初學(xué)者的各種問(wèn)題談?wù)剛€(gè)人刷力扣這方面的觀點(diǎn)。
刷哪些題?
大家刷力扣,目標(biāo)肯定就是為了沖擊大廠的面試筆試,小部分就是為了堅(jiān)持刷題保持感覺(jué)提升自己算法編程能力,那么你肯定要把重點(diǎn)內(nèi)容先掌握,哪些是重點(diǎn)內(nèi)容呢?
劍指offer:
首先是劍指offer(https://leetcode-cn.com/problem-list/xb9nqhhg/),劍指offer的優(yōu)先級(jí)還是很高的,就業(yè)必刷。在牛客上和力扣平臺(tái)上都可以刷劍指offer的題,但是我個(gè)人更推薦力扣這個(gè)平臺(tái),我第一次刷劍指offer就是和大家在牛客平臺(tái)上刷的(雖然有點(diǎn)時(shí)間不知道還有沒(méi)有人記得),但是前一段時(shí)間在力扣上刷劍指offer,有部分題(很少)把自己很久前的代碼提交試了一下發(fā)現(xiàn)wa了。所以牛客測(cè)試數(shù)據(jù)相對(duì)還是比較弱的,力扣上的測(cè)試數(shù)據(jù)相對(duì)較多,在大部分情況,你過(guò)了代碼基本上就沒(méi)有什么邏輯漏洞了。
除了劍指offer名氣大,我推薦你刷劍指offer的一個(gè)原因是劍指offer的題目是真的經(jīng)典!短短六十多道題,內(nèi)容覆蓋常見(jiàn)數(shù)據(jù)結(jié)構(gòu)比如鏈表、二叉樹(shù)、圖、隊(duì)列、棧、哈希表等等,常見(jiàn)的算法和經(jīng)典問(wèn)題包過(guò)二分、動(dòng)態(tài)規(guī)劃、全排列問(wèn)題、滑動(dòng)窗口、貪心、分治、排序、位運(yùn)算、dfs、bfs等等,刷完這些題,是真的可以收獲和學(xué)到很多!
另外一方面就是劍指offer在面試筆試中出現(xiàn)是真的非常高頻 ,面試官考察的題目一般都是經(jīng)典題,面試官不創(chuàng)造題目,只抽選題目,而抽選題目的題目基本就是力扣和劍指offer的題目,劍指offer就是非常高頻的題庫(kù)之一。
力扣HOT100|力扣前200
力扣HOT100:https://leetcode-cn.com/problem-list/2cktkvj/
力扣前200:https://leetcode-cn.com/problemset/all/
優(yōu)先力扣HOT100,力扣HOT100是對(duì)力扣某一時(shí)間(因?yàn)榱垲}一直在增加)題庫(kù)選出的100道優(yōu)質(zhì)題,這些題跟劍指offer類似,都是一些高頻問(wèn)題,有不少問(wèn)題確實(shí)還是有難度的,對(duì)于不少人來(lái)說(shuō)特別容易卡殼。但是如果力扣HOT100能刷完,那你其實(shí)加上劍指offer快200的題量就挺可觀的了。
力扣目前已經(jīng)有兩三千道題目,并且還在增加,所以想刷完力扣,幾乎是不太可能的,如果想順序刷,還是推薦前200,力扣前200和力扣HOT100重合很大,前兩百質(zhì)量還是很高的(不是意思后面質(zhì)量不高,只是那么大題庫(kù)刷到后面就會(huì)出現(xiàn)很多同類型、同套路的題目),所以還是推薦刷完力扣前200的。
刷完這幾個(gè)部分大概能夠擁有接近300高質(zhì)量題的刷題量,我覺(jué)得應(yīng)對(duì)大部分的互聯(lián)網(wǎng)公司面試是足夠足夠了,出一些變換自己也能夠相對(duì)容易的看出來(lái)。
刷題順序?
上面列舉了待刷的題庫(kù),既然知道了要刷哪些題,有沒(méi)有一個(gè)比較推薦的刷題順序呢?是否需要分類刷?
是否要分專題分類我感覺(jué)這個(gè)看人的。
如果你有數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ),比如考研或者平時(shí)數(shù)據(jù)結(jié)構(gòu)學(xué)的還不錯(cuò),常見(jiàn)數(shù)據(jù)結(jié)構(gòu)與算法原理明白能夠?qū)崿F(xiàn)部分,又或者有部分刷題經(jīng)驗(yàn),那么我推薦你直接順序著刷就完了。從客觀來(lái)說(shuō),力扣和劍指offer上面的題目有難題,也有需要高級(jí)數(shù)據(jù)結(jié)構(gòu)的,但更多的是在數(shù)據(jù)結(jié)構(gòu)或者邏輯基礎(chǔ)上的巧妙思維題型更多,如果你有數(shù)據(jù)結(jié)構(gòu)與算法的基礎(chǔ),你還是比較容易get到考察點(diǎn)的。順序刷的途中遇到某個(gè)不會(huì)的技巧或者數(shù)據(jù)結(jié)構(gòu),學(xué)習(xí)一下加入自己的"腦庫(kù)"中即可。
如果你是真的小白,那你就要為自己手動(dòng)找到一條可行走的路,那我推薦你可以按照一些專題去各個(gè)擊破。因?yàn)槟闶切“兹绻樞蛩⑦@個(gè)題不會(huì),學(xué)了,在刷下一題,又學(xué)了個(gè)完全陌生的新東西。沒(méi)有基礎(chǔ)短期內(nèi)學(xué)習(xí)太多比較陌生的新東西很難吸收,很容易忘,就會(huì)陷入怎么學(xué)不會(huì)的苦惱中。所以你可以把刷題當(dāng)成一個(gè)臺(tái)階,一層一層往上爬,剛開(kāi)始找easy easy 那種a+b類型的題求過(guò)。對(duì)于數(shù)據(jù)結(jié)構(gòu)方面的題,從鏈表開(kāi)始先學(xué)透單鏈表、雙鏈表、循環(huán)鏈表各種插入刪除實(shí)現(xiàn),然后在題庫(kù)中找鏈表相關(guān)題進(jìn)行逐個(gè)攻破(鏈表中的也可細(xì)分鏈表插入、刪除、反轉(zhuǎn)、合并、查找、排序等等),鏈表大專題之后二叉樹(shù)大專題、哈希…… 這樣你短期內(nèi)學(xué)習(xí)某一個(gè)數(shù)據(jù)結(jié)構(gòu)或者算法技巧,多去刷題鞏固吸收效果比較好!在這種情況切勿覺(jué)得簡(jiǎn)單就草草下一個(gè),你不敲代碼,可能不會(huì)知道自己會(huì)出現(xiàn)什么問(wèn)題。
三個(gè)為什么
為什么見(jiàn)到一個(gè)題沒(méi)思路?
這種情況大概率是因?yàn)橐?jiàn)少了,刷題也是個(gè)緩慢的過(guò)程,見(jiàn)得多刷的多些,來(lái)的感覺(jué)才能更快一些。還有一部分可能因?yàn)榻o自己安排的刷題路線不夠平和。你上來(lái)去肝hard難度的沒(méi)思路不是很正常。
簡(jiǎn)單題很容易懂實(shí)現(xiàn)起來(lái)很難?
這種情況可能基礎(chǔ)邏輯可能缺乏訓(xùn)練,對(duì)編程語(yǔ)言的集合框架掌握也有所欠缺。有些題可能涉及到集合框架(Map、Set、List、Stack、Queen)各種嵌套、聯(lián)立需要你有個(gè)清晰的層次感和邏輯。
你刷題,需要熟練使用一門(mén)編程語(yǔ)言,熟悉這個(gè)編程語(yǔ)言的常見(jiàn)操作api、集合框架、函數(shù),這些是解決問(wèn)題的工具幫助我們提高效率(不至于每次手寫(xiě)個(gè)隊(duì)列、手寫(xiě)個(gè)哈希表吧)。
這個(gè)問(wèn)題推薦可以先刷幾道簡(jiǎn)單的字符串處理問(wèn)題,字符串處理問(wèn)題很多涉及到的集合框架和邏輯控制比較多,如果時(shí)間充足推薦PAT乙級(jí)的題目刷一些練手鍛煉邏輯和編程語(yǔ)言掌握。
看了很多題解為啥還是不會(huì)刷題?
看了很多題沒(méi)刷那跟沒(méi)刷區(qū)別不太大,印象微弱。從學(xué)習(xí)角度,刷題和我們學(xué)數(shù)學(xué)的方式有點(diǎn)相似,學(xué)會(huì)了數(shù)學(xué)題公式和例題,但還需要大量練習(xí)才能真正掌握。
只有自己親身敲了每一行代碼,每一行代碼邏輯是什么,是自己思考出來(lái)的而不是看懂別人的思考。從0到1完整實(shí)現(xiàn)整個(gè)程序,這才能行成一個(gè)完整邏輯,然后可能出現(xiàn)各種bug自己調(diào)試看看找出問(wèn)題。
可以看題解,看了自己要能完全寫(xiě)出來(lái)才行,如果刷了1000+題,你看了題解不刷沒(méi)問(wèn)題,看個(gè)思路過(guò)了被卡的地方就行。但如果刷了100不到,那你看懂還是老老實(shí)實(shí)按照別人的邏輯閉卷式的復(fù)現(xiàn)一遍。不去實(shí)現(xiàn)說(shuō)有很多問(wèn)題,記不住,也沒(méi)啥奇怪的。
總結(jié)一下,如果刷題量不到100感覺(jué)狀態(tài)不行就簡(jiǎn)單粗暴多刷題先,如果刷了兩三百狀態(tài)還是很差那么就要好好找一下其他原因。
拿到一道題的處理流程
拿到一道題,正確的刷和學(xué)習(xí)方法是怎么樣的呢?
確定考察點(diǎn)、確定思路
讀到一個(gè)題,讀完題意后首先就是要了解這個(gè)題到底考察的內(nèi)容是什么?當(dāng)然如果你按照專題來(lái)刷,那可能這方面就容易很多。首先可以確定下題型大類型,是圖論的,還是二叉樹(shù),還是字符串的,還有最常見(jiàn)數(shù)組給的一堆數(shù)據(jù)。就要拿著這個(gè)類型的題目往這方面常見(jiàn)算法考察點(diǎn)靠。比如給個(gè)數(shù)組數(shù)據(jù)讓你查找計(jì)算,有可能是雙指針,有可能是哈希,有可能還是位運(yùn)算,還可能是動(dòng)態(tài)規(guī)劃,還可能是要貪心處理。不過(guò)大部分題是在各個(gè)經(jīng)典算法的經(jīng)典問(wèn)題上進(jìn)行一些變化,要知道經(jīng)典算法處理的哪些經(jīng)典問(wèn)題。
如果能確定考察點(diǎn),可以想想細(xì)節(jié)開(kāi)始實(shí)現(xiàn);如果確定不了考察點(diǎn),沒(méi)思路,先別直接看題解,看看題目標(biāo)簽的提示。有時(shí)你看一個(gè)題可能說(shuō):這題啥方法啊我只會(huì)暴搜,有的確實(shí)就是搜索剪枝……
除了標(biāo)簽,還要看數(shù)據(jù)范圍!數(shù)據(jù)范圍內(nèi)的數(shù)據(jù)都是可能出現(xiàn)的,不同數(shù)據(jù)范圍可能使用方法不同(這點(diǎn)數(shù)組題較多,有些題巧用哈希、原地置換對(duì)數(shù)據(jù)有要求)。
如果自己看了標(biāo)簽想想來(lái)靈感那最好,如果還是沒(méi)有靈感,那點(diǎn)一下題解。可以從標(biāo)簽標(biāo)題中看看能不能有靈感,有不少題解會(huì)給足夠多的暗示有些人看到就能明白了。
如果還是不會(huì)那就老老實(shí)實(shí)點(diǎn)進(jìn)去看看別人的思路,有的是視頻,有的是圖文,看懂為止,要是還自己看不懂,要么請(qǐng)假一下別人,要么放棄吧!
編寫(xiě)代碼、測(cè)試
編寫(xiě)代碼的過(guò)程不要有任何參考!編寫(xiě)代碼的過(guò)程不要有任何參考!重要的話說(shuō)兩遍,思路可以看,別人的代碼也可以看,你自己寫(xiě)代碼不要參考和ctrl c + ctrl v,工程項(xiàng)目能跑起來(lái)就行為了效率都是cv大法,但是面試筆試題基本要你閉卷,有的還要你用在線IDE連提示都不全的。
寫(xiě)代碼常常要考慮常見(jiàn)問(wèn)題:測(cè)試數(shù)據(jù)邊界(比如Integer.MAX_VALUE,Integer.MIN_VALUE這種邊界數(shù)值),循環(huán)控制邊界處理,末尾數(shù)據(jù)處理(有時(shí)候會(huì)被遺忘處理),特殊異常情況考慮,數(shù)值范圍是否合理,算法復(fù)雜度是否能夠跑出來(lái),數(shù)據(jù)深淺拷貝,簡(jiǎn)化重復(fù)遍歷和操作,變量命名清晰,注釋較為完整……
寫(xiě)完代碼,用測(cè)試案例多測(cè)測(cè),確保萬(wàn)無(wú)一失。力扣經(jīng)常出空值測(cè)試案例,因?yàn)檫@個(gè)wa了很多次……
如果出現(xiàn)和想象中不一樣的問(wèn)題,先看一遍自己代碼邏輯看看能否看出問(wèn)題,如果看得出正好,看不出的話自己打印輸出或者debug找找問(wèn)題,直到改對(duì)為止,有很多題需要考慮比較全才能ac。
方法、結(jié)果對(duì)比
不要以為ac了就完了,你要看看自己時(shí)間上超越了多少人,推薦從這兩個(gè)維度來(lái)衡量自己的代碼:
要超越70%以上的人(根據(jù)自己要求適當(dāng)提高):大部分題超越70%說(shuō)明你的方法上是沒(méi)問(wèn)題的,可能有些小的方面可以進(jìn)行優(yōu)化。比如StringBuilder替代String進(jìn)行字符串拼接,使用char[]數(shù)組替代String進(jìn)行遍歷枚舉等等。
自己的方法在好方法時(shí)間范圍內(nèi):有些題比較卷,大家都是最快方法你的代碼可能比別人差1ms就顯得很慢,這時(shí)你只要確定你的方法很優(yōu)秀就可以不一定要追求100%,并且這個(gè)時(shí)間花銷不同評(píng)測(cè)姬出來(lái)結(jié)果可能也不同的。可以看看大家的時(shí)間花銷區(qū)間,如果你的方法跟最快的在幾ms或者30%時(shí)間范圍,其實(shí)都是ok的。別人4ms,你5ms沒(méi)啥問(wèn)題,別人50ms,你70ms也沒(méi)啥問(wèn)題,但是如果別人80ms你800ms那差的太多就要看看自己邏輯和代碼了。
另外,力扣你點(diǎn)擊前面時(shí)間的柱狀圖是可以看到別人時(shí)間開(kāi)銷較小的代碼(有的現(xiàn)在跑可能因?yàn)闇y(cè)試數(shù)據(jù)變動(dòng)沒(méi)那么快了),可以參考學(xué)習(xí)一下別人的處理方式。
鞏固提高
過(guò)了這道題,可以看看題解區(qū)別人有沒(méi)有更巧妙的處理方法,當(dāng)你自己ac之后和別人有個(gè)直接對(duì)比印象會(huì)比較深刻:還可以這樣!
如果感覺(jué)這類題型掌握不扎實(shí)還想再練一下可以看相似題型去及時(shí)鞏固一下。
結(jié)語(yǔ)
上面的一些方法僅限于給一些初學(xué)者建議,不一定很準(zhǔn)確高效可以參考,如果上面題差不多有閑余之力,推薦可以跟著每日一題打卡,半年就是180+題量,一年就是365題量,相當(dāng)客觀!
最近開(kāi)了個(gè)新群進(jìn)行每日一題打卡,相互督促,有需要的可以加我拽你進(jìn)群。第一次考研結(jié)束和大家打卡劍指offer,第二次去年暑假一起打卡150道力扣題,這是第三次和csdn小伙伴們一起打卡,每次都會(huì)認(rèn)識(shí)新的小伙伴,有新的收獲,歡迎大家一起學(xué)習(xí),一起加油💪!
方法和路線不是最難的,最難的是堅(jiān)持,希望和大家一起在后面的路上不變禿但是變強(qiáng)🐶!歡迎加入(備注csdn打卡)👇🏻👇🏻
總結(jié)
以上是生活随笔為你收集整理的1024,给大家谈谈如何搞透刷题 玩转力扣!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一道题,最小操作次数使数组元素相等引发的
- 下一篇: 一文搞懂动态规划