日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何有效地做算法题

發(fā)布時(shí)間:2025/3/21 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何有效地做算法题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章最早發(fā)在我團(tuán)隊(duì)的文檔中。我的團(tuán)隊(duì)鼓勵(lì)每個(gè)同學(xué)都在業(yè)余時(shí)間多做算法題,特別是新人。個(gè)人認(rèn)為在編程能力的提升上比做 side project 更有用,對職業(yè)發(fā)展也是如此。當(dāng)然出于興趣做的 side project 另當(dāng)別論。轉(zhuǎn)到這里,希望對各位讀者有用。

目的

持續(xù)做算法題的目的仍然是自身能力提升。可以繼續(xù)細(xì)化成三點(diǎn):

  • 保持思維敏捷。非常重要,狀態(tài)好才能保持對編程的熱情。

  • 對基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)、查找和排序保持熟練。能解決日常開發(fā)中的性能相關(guān)問題。

  • 積累對問題域的探索。只有對問題域有足夠的探索,才可能舉一反三,迸發(fā)靈感。

方法

為了更有效地實(shí)現(xiàn)上面的目標(biāo)。推薦用下面的方式來做題:

嚴(yán)格使用番茄時(shí)鐘進(jìn)行規(guī)劃

在刷題的過程中非常最容易產(chǎn)生挫敗感,無法堅(jiān)持。原因是,長時(shí)間的思考導(dǎo)致疲倦,多次積累的疲倦使得自己產(chǎn)生了 抵觸記憶。以至于會下意識覺得做題就是 刻苦。

推薦大家在開始之前看看《意志力》。里面指出 喜好 是會被記憶操控的,如果每次做一件事最后留下的映像都是輕松愉快的,那么人就會越來越喜歡做此事,反之厭惡。所以為了能保持做題的興趣,務(wù)必每次要主動給自己留下好的記憶。

番茄時(shí)鐘能夠很好地保障不會出現(xiàn) 長時(shí)間 的思考,同時(shí)也能保障不容易 疲倦。如果你已經(jīng)能很熟練的使用番茄時(shí)鐘,請?zhí)^。如果你對番茄時(shí)鐘的印象仍然只是20分鐘休息一次。那么請繼續(xù)閱讀。

番茄時(shí)鐘有兩個(gè)重點(diǎn),一是通過長期的訓(xùn)練,讓大腦習(xí)慣在一段時(shí)間內(nèi)保持高效。二是通過要求每次在開始前有規(guī)劃和每次結(jié)束后有總結(jié),保障產(chǎn)出。當(dāng)把這兩點(diǎn)應(yīng)用到做算法的過程中時(shí),應(yīng)該采取以下的方式:

用一個(gè)番茄時(shí)鐘對題目進(jìn)行徹底的分析

目前 leetcode 上的題大致可分為兩種類型:

  • 對某種復(fù)雜規(guī)則的徹底解析,很有可能要構(gòu)造狀態(tài)機(jī),充分考慮邊界情況。

  • 對某種數(shù)據(jù)結(jié)構(gòu)及算法的應(yīng)用。

  • 對數(shù)學(xué)概念、遍歷、動態(tài)規(guī)劃等的綜合應(yīng)用。

在這個(gè)分析過程中首先要大致判斷出屬于哪一類。在掌握了基本的數(shù)據(jù)結(jié)構(gòu)和算法后,應(yīng)該能很好的判斷是不是屬于前兩類。如果判斷不出說明需要回頭先重新復(fù)習(xí)基本數(shù)據(jù)結(jié)構(gòu)。推薦《算法》一書。不要強(qiáng)行刷題。算法書的每種數(shù)據(jù)結(jié)構(gòu)及算法的大概思路、解決的問題以及相應(yīng)的時(shí)間和空間復(fù)雜度了解之后可以再回來。

第一種情況

例子:https://leetcode.com/problems/valid-number/description/

這個(gè)番茄時(shí)鐘內(nèi)的目標(biāo)是:

  • 理清題目背后解法要用的技術(shù)

  • 充分收集可能涉及到的邊界

完成后應(yīng)該有的總結(jié)是:

  • 是否理清了要用的技術(shù)

  • 是否有不確定的地方

  • 收集到的邊界是否能覆蓋所有情況

如果發(fā)現(xiàn)在要用的技術(shù)中有不熟悉的地方,應(yīng)該立即中斷,開啟另一個(gè)番茄時(shí)鐘進(jìn)行學(xué)習(xí)。切忌盲目嘗試。當(dāng)發(fā)現(xiàn)有不確定的地方時(shí),重新開啟一個(gè)番茄時(shí)鐘,按照當(dāng)前思路把不確定地方當(dāng)成一個(gè)單獨(dú)的算法問題進(jìn)行解決。

第二種情況

例子:https://leetcode.com/problems/reverse-pairs/

這一類題目通常采取遍歷的方法一定都能找到解法。重點(diǎn)是找到最優(yōu)解,因此需要提前有足夠的數(shù)據(jù)結(jié)構(gòu)的知識。數(shù)據(jù)結(jié)構(gòu)可大致分為鏈(數(shù)組、棧、隊(duì)列)、樹、圖。在這三類數(shù)據(jù)中要分別掌握排序和查找算法。特別是相應(yīng)的時(shí)間復(fù)雜度。

這類題目很好判斷,通常題目中會描述了幾個(gè)數(shù)據(jù)或者狀態(tài)的關(guān)聯(lián)的關(guān)系,然后需要你找出符合條件的某些數(shù)據(jù)。那么將題目中的關(guān)聯(lián)關(guān)系轉(zhuǎn)換成相應(yīng)的數(shù)據(jù)結(jié)構(gòu),再使用對應(yīng)算法就夠了。要對數(shù)據(jù)結(jié)構(gòu)的足夠熟悉,才能知道如何轉(zhuǎn)化。

這種情況下番茄時(shí)鐘的目標(biāo)是:

  • 將問題轉(zhuǎn)化為對相應(yīng)數(shù)據(jù)結(jié)構(gòu)的問題。

總結(jié)是:

  • 需不需要分情況討論,需要一種數(shù)據(jù)結(jié)構(gòu)還是多種

  • 相應(yīng)數(shù)據(jù)結(jié)構(gòu)是否能完全覆蓋題目問題中的所有情況

第三種情況

例子:https://leetcode.com/problems/minimum-window-substring/

這一類情況最好用排除法,發(fā)現(xiàn)不是第一種或者第二種,那么再往這種情況下考慮。這類題的特點(diǎn)是通常是發(fā)散性質(zhì),剛看到題目容易有思路,但不太容易找到最優(yōu)解。這種情況下,也要先判斷題目子類型。

  • 如果發(fā)現(xiàn)題目能從遍歷的角度解決問題,那么可以往遍歷的優(yōu)化上去想。例如是否在遍歷的時(shí)候能夠排除掉一些情況。或者通過排序等手段之后,能實(shí)現(xiàn)遍歷時(shí)排除某些情況。

  • 如果發(fā)現(xiàn)題目中存在多種約束關(guān)系,然后求某個(gè)值,那么可以往數(shù)學(xué)方程組上去想。

  • 如果發(fā)現(xiàn)問題可以被遞歸解決,并且能夠?qū)⑦f歸方式轉(zhuǎn)化成順序方式,可以往動態(tài)規(guī)劃上去想。

在這種情況下,番茄時(shí)鐘的目標(biāo):

  • 判斷出題目類型。

總結(jié):

  • 是否有其他類型更適合。

  • 是否需要多種手段結(jié)合。

執(zhí)行時(shí)的番茄時(shí)鐘

當(dāng)分析完之后,建議不要開始寫代碼,一定要休息片刻。執(zhí)行階段是對我們平時(shí)寫代碼狀態(tài)的一種鍛煉,應(yīng)該非常珍惜。如果一個(gè)番茄時(shí)鐘執(zhí)行不完,應(yīng)該拆分成多個(gè)。在這段時(shí)間中,設(shè)定的番茄時(shí)鐘目標(biāo)應(yīng)該是:

高效地驗(yàn)證分析階段的思路

要實(shí)現(xiàn)執(zhí)行高效,最重要的是養(yǎng)成良好的編碼習(xí)慣,不要犯小錯(cuò)誤。要始終朝著只要想清楚了,一次寫好,不要調(diào)試的狀態(tài)要求自己。這里常見的小錯(cuò)誤有:

  • 拼寫錯(cuò)誤。變量命名要足夠清楚,不要用單個(gè)字母或者語意不明的單詞。

  • 數(shù)組邊界未考慮。

  • 空值未考慮。

  • 用 Math.ceil 之類函數(shù)時(shí)未考慮清楚上下界。

調(diào)試超過寫代碼時(shí)間 30% 時(shí)說明狀態(tài)非常有問題。在這個(gè)階段的總結(jié)是:

  • 是否完成了對分析的驗(yàn)證

  • 編碼過程是否足夠高效

如果中間發(fā)現(xiàn)了分析階段的錯(cuò)誤或者疏漏。應(yīng)該立即結(jié)束編碼,休息。并且重新開啟分析階段的時(shí)鐘。切忌邊寫邊改方案。如果發(fā)現(xiàn)編碼過程狀態(tài)不夠好,應(yīng)該加長休息時(shí)間,或者干脆結(jié)束掉。不要給自己留下低效的映像。將任務(wù)留到第二天其實(shí)也可以檢驗(yàn)自己第一天的思路是否足夠系統(tǒng)化,如果是,那么第二天應(yīng)該能很快的重新找回思路。

任一番茄時(shí)鐘結(jié)束時(shí)

一定要做好總結(jié),特別是當(dāng)沒有解出題來,沒有思路的時(shí)候,一定要通過結(jié)束階段的總結(jié)來反思犯了什么錯(cuò)誤。解出來了也一定要總結(jié)題目的特點(diǎn),題目中哪些要素是解出該題的關(guān)鍵。不做總結(jié)的話,花掉的時(shí)間所得到的收獲通常只有 50% 左右。

在題目完成后,要特別注意總結(jié)此題最后是歸納到哪種類型中,它在這種類型中的獨(dú)特之處是什么。經(jīng)過總結(jié),這樣題目才會變成你在此問題域中的積累。

做好總結(jié),讓每道題都有最大的收獲。一個(gè)月之后自己的狀態(tài)應(yīng)該會有很大變化。

如何分享

在這個(gè)倉庫中進(jìn)行解題分享時(shí),建議大家就把自己番茄時(shí)鐘的執(zhí)行記錄進(jìn)行分享。最后標(biāo)準(zhǔn)的解法以及思路其實(shí)在 discussion 中都有。對他人有用的分享不是結(jié)果,而是:

  • 你在番茄時(shí)鐘中是如何規(guī)劃的,也就是番茄時(shí)鐘的目標(biāo)。

  • 你是如何分析,也就是思路。

  • 你的結(jié)論是什么,或者是你在執(zhí)行時(shí)除了什么問題。

  • 你所總結(jié)出的題目的關(guān)鍵部分。也就是對問題域進(jìn)行探索的經(jīng)驗(yàn)。

祝各位成長快樂。

總結(jié)

以上是生活随笔為你收集整理的如何有效地做算法题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。