<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          50 歲阿姨的程序員夢(mèng)

          共 1909字,需瀏覽 4分鐘

           ·

          2022-04-26 01:14


          最近在小紅書上看到這樣一個(gè)帖子:一個(gè) 50 歲阿姨開(kāi)始在 LeetCode 上刷題,當(dāng)她第一次提交通過(guò)時(shí),感受是好玩與興奮。

          起初我以為她是營(yíng)銷號(hào),但點(diǎn)開(kāi)主頁(yè)之后發(fā)現(xiàn)她確實(shí)只是在分享她第一次刷題成功的喜悅。

          在這里,還是挺佩服她的。

          掃了一眼代碼,不難注意到,代碼的解題思路是暴力的解法。

          今天就順著這個(gè)話題和大家聊一下:新手如何有效的刷算法題。

          如果你想要開(kāi)始刷題,那么第一步就是:打開(kāi) LeetCode 官網(wǎng),點(diǎn)擊標(biāo)簽,選擇一道順眼的題目開(kāi)始刷。

          就像這個(gè) 50 歲的阿姨一樣選題。

          注意,在這過(guò)程中,不要左思右盼,不要去搜索與思考到底是刷 LeetCode 好還是去牛客網(wǎng)刷劍指 Offer 好。

          我作為一名算法小白的時(shí)候,就犯了這個(gè)錯(cuò)誤:在粗略的學(xué)習(xí)基本的數(shù)據(jù)結(jié)構(gòu)與算法后,準(zhǔn)備開(kāi)始刷題,總想著找一個(gè)最有效最好的刷題平臺(tái)。

          一會(huì)在 LeetCode 題解區(qū)逛逛,一會(huì)在??途W(wǎng)看看面經(jīng),結(jié)果就是整個(gè)人煩躁不安,焦慮迷茫,題沒(méi)有刷幾道,羨慕嫉妒恨卻增加了幾分:別人的代碼怎么這么簡(jiǎn)潔 ?別人的 Offer 怎么這么亮眼?

          經(jīng)過(guò)痛定思定之后,我開(kāi)始自我剖析自己想好好刷題卻無(wú)效的原因:

          1、沒(méi)有接受自己是算法小白的事實(shí)

          我那時(shí)候只是按圖索驥般的稍微系統(tǒng)的學(xué)習(xí)了基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)與算法知識(shí),根本沒(méi)有真正的利用這些知識(shí)去處理問(wèn)題。

          在刷題的過(guò)程中,總想證明自己可以的,別人可以寫成簡(jiǎn)潔高效的解題方法,我也要!于是去不停的找題證明自己,結(jié)果就是越刷越?jīng)]有效果,自己根本就看不懂題目考察的數(shù)據(jù)結(jié)構(gòu)與思想。

          整個(gè)人完全奔潰,不刷題了,不準(zhǔn)備算法面試了,不準(zhǔn)備跳槽了!

          后來(lái)我不停的告誡自己:作為一名非科班的程序員,肯定比不上他們呀,如果隨隨便便的學(xué)了一點(diǎn)就能刷題順利,那別人大學(xué)四年不白學(xué)了!

          所以前期先接受自己的思考方式,暴力解法其實(shí)也是一種有效的解法。

          2、沒(méi)有合理的刷題

          我只是盲目的追求刷題的數(shù)量,即使刷了 200 道,腦中依舊一團(tuán)漿糊。

          后來(lái)才明白,吃透一道題目比亂刷十道題目更有價(jià)值。

          經(jīng)過(guò)不斷的摸索與試驗(yàn),形成了自己的一套刷題路徑。

          • 自己的解法
          • 網(wǎng)上好的解法
          • 自己的解法可以改進(jìn)的地方
          • 不停的優(yōu)化
          • 尋找相同的題型重復(fù)練習(xí)
          • 總結(jié)

          每一個(gè)題目都經(jīng)過(guò)至少一遍這樣的迭代,徹底吃透一道題進(jìn)而掌握一種題型。

          以一道極其簡(jiǎn)單的動(dòng)態(tài)規(guī)劃題為例 ,LeetCode 第 70 號(hào)問(wèn)題:爬樓梯。當(dāng)時(shí)的我根本不知道動(dòng)態(tài)規(guī)劃的相關(guān)概念,什么狀態(tài),什么轉(zhuǎn)移方程,通通沒(méi)聽(tīng)過(guò)。

          沒(méi)錯(cuò),當(dāng)時(shí)就那么菜!

          二話不說(shuō),直接使用暴力解法。

          class?Solution?{
          ????public?int?climbStairs(int?n)?{
          ????????return?calcWays(n);
          ????}
          ????private?int?calcWays(?int?n?){
          ????????if?(?n?==?1)?return?1;
          ????????if?(?n?==?2)?return?2;
          ????????return?calcWays(n-1)?+?calcWays(n-2);
          ????}
          }

          很明顯,無(wú)腦的遞歸暴力解法包含了大量的重復(fù)計(jì)算,提交上去直接標(biāo)紅提示超出時(shí)間限制。

          后來(lái)看了網(wǎng)上高票答案的分析,知道了備忘錄的概念,于是很容易寫出優(yōu)化后的代碼。

          //采用備忘錄的方式來(lái)存子問(wèn)題的解以避免大量的重復(fù)計(jì)算

          class?Solution?{?
          ????int[]?memo;?
          ????public?int?climbStairs(int?n)?{?
          ????????memo?=?new?int[n+1];?
          ????????return?calcWays(n);?
          ????}?
          ????private?int?calcWays(?int?n?){?
          ????????if?(?n?==?1)?return?1;?
          ????????if?(?n?==?2)?return?2;?
          ????????if?(memo[n]?==?0)?
          ???????????memo[n]?=??calcWays(n-1)?+?calcWays(n-2);?
          ????????return?memo[n];?
          ????}?

          }

          再后來(lái),發(fā)現(xiàn)備忘錄是自頂向下的方式,稍許變動(dòng),修改為自低向上的遞推方式就是動(dòng)態(tài)規(guī)劃的形式。

          class?Solution?{?

          ????public?int?climbStairs(int?n)?{?
          ????????int[]?memo?=?new?int[n+1];?
          ????????memo[0]?=?1;?
          ????????memo[1]?=?1;?

          ????????for(int?i?=?2?;?i?<=?n;?i++){?
          ????????????memo[i]?=?memo[i-1]?+?memo[i-2];?
          ????????}?
          ????????return?memo[n];?
          ????}?
          }

          按照這樣的刷題路徑下來(lái),發(fā)現(xiàn)對(duì)這類題型有了初步的思考途徑,有了發(fā)力點(diǎn),再也不會(huì)一籌莫展:看題懵逼半小時(shí),Coding 只會(huì)按空格。

          徹底搞懂這題后,就需要找到類似的題型,然后不斷的重復(fù)練習(xí):最小路徑和、整數(shù)拆分、完全平方數(shù)、解碼方法、不同路徑、不同路徑 II。

          通過(guò)這些練習(xí),尋找題目中的共同點(diǎn),為什么這類題型都可以這樣思考呢?

          慢慢的,知道了最優(yōu)子結(jié)構(gòu)、狀態(tài)轉(zhuǎn)移方程、重疊子問(wèn)題的概念,不知不覺(jué)動(dòng)態(tài)規(guī)劃的知識(shí)點(diǎn)已經(jīng)掌握了 80%。

          再遇到更高難度的動(dòng)態(tài)規(guī)劃的題目時(shí),心里也明白,一時(shí)半會(huì)沒(méi)做成無(wú)法就是最優(yōu)子結(jié)構(gòu)、狀態(tài)轉(zhuǎn)移方程、重疊子問(wèn)題沒(méi)有理清楚。

          這樣長(zhǎng)期堅(jiān)持下來(lái),接觸新的題型時(shí)也可以從容不迫的思考。

          喜歡大家也能找到像這位阿姨那樣刷題的樂(lè)趣。



          本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲??!

          推薦閱讀:

          六款Linux常用遠(yuǎn)程連接工具介紹

          24 個(gè)常見(jiàn)的 Docker 疑難雜癥處理技巧

          在央企當(dāng)程序員是一種怎樣的體驗(yàn)?


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲??!

          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操熟女网站 | 黄片叉蛋的视频在线播放免费看 | 亚洲t v | 亚洲se性图 | 日韩av有码|