目前主流的刷題流派有兩種,一種【龜系】,一種【兔系】。
「龜系」刷法的精髓就是每個題目都做乾淨。不滿足於一種解法,各種解法都寫一寫。這種流派適合不太急於準備演算法面試的小夥伴,追求演算法的乾淨優雅。
「兔系」刷法的精髓是暴力,按照標籤來刷,使用固定套路來刷。比如小吳之前分析的那道拍案叫絕的演算法題,如果告訴你是標籤是異或,你馬上能 ac 。這都是套路。
每個標籤內部可以按照 easy 、medium、hard 的順序做,演算法練習是乙個系統工程,不要一開始就追求難題,先熟悉熟悉套路,循序漸進的去做,後面所謂的難題也就不在話下。
建議小夥伴第一遍刷題可以使用 【兔系】 法。
萬事開頭難,看懂題目是做好一道演算法題最開始也是最重要的一步。
我將 leetcode 上的題大致分為三種型別:
一些演算法題目會在標題或題目描述中給出明確的題目型別資訊,比如二叉樹的重建、鍊錶的反轉。
而有一些題目中則在條件中給予暗示 :
無論怎樣,當你拿到一道演算法題的時候,希望你能先去弄明白這道題目要考察的是什麼,是簡單的資料結構還是複雜的演算法思想。
先去理清題目背後解法要用的技術,這樣,這道演算法題目才有做下去的可能。
一般來說,bat 等大廠的演算法面試題基本上都是 medium 級別及以下,並希望面試者能在 20 分鐘以內給出乙個「相對正確」的回答。
為什麼說是 相對正確 ?
每一道演算法題得解法都有很多種,並不是說你沒有給出完美解或者最優解你就是錯的。
「正確」 本身是乙個相對概念。
在演算法面試或者平時的演算法練習時,如果沒有頭緒,可以嘗試使用暴力解法。
(不要忽視暴力解法。暴力解法通常是思考的起點。)
當你使用了暴力解法之後,可以與面試官進行溝通優化,把這個過程看作是和面試官一起**乙個問題的解決方案的過程,這也可以讓面試官了解你的思考問題的方式。這也是乙個「正確」的回答方式。
先實現功能再去優化。
done is better than perfect 。
到這一步就是演算法的落地了:將上面的思考結果思路轉換為**。
在編寫的過程中需要注意題目中的邊界條件,比如陣列是否為空,指標是否為 null;同時也要注意**的規範性:變數名,模組化,復用性。
一定要做好總結,特別是當沒有解出題來,沒有思路的時候,一定要通過結束階段的總結來反思犯了什麼錯誤。解出來了也一定要總結題目的特點,題目中哪些要素是解出該題的關鍵。不做總結的話,花掉的時間所得到的收穫通常只有 50% 左右。
在題目完成後,要特別注意總結此題最後是歸納到哪種型別中,它在這種型別中的獨特之處是什麼。經過總結,這樣題目才會變成你在此問題域中的積累。
做好總結,讓每道題都有最大的收穫。乙個月之後自己的狀態應該會有很大變化。[1]
你我都是普通的程式設計師,不像那些玩 acm,拳打 leetcode,腳踩劍指 offer,我們得接受現實:刷題,就是很痛苦很打擊的過程。
但,一遍一遍的刷,多刷一題就多掌握一題,你總會比別人更強一點。
references
[1]
**:
如何有效地做演算法題
這篇文章最早發在我團隊的文件中。我的團隊鼓勵每個同學都在業餘時間多做演算法題,特別是新人。個人認為在程式設計能力的提公升上比做 side project 更有用,對職業發展也是如此。當然出於興趣做的 side project 另當別論。轉到這裡,希望對各位讀者有用。持續做演算法題的目的仍然是自身能力...
演算法題 最長有效括號
題目描述 給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2 解釋 最長有效括號子串為 示例 2 輸入 輸出 4 解釋 最長有效括號子串為 解法一 使用棧來儲存元素下標,從下標來計算長度。時間複雜度 o n n為字串長度,遍歷每個字串元素。空間複雜度 o n 棧...
寫演算法題的時候怎麼寫注釋
比較好的寫注釋方式 先寫出大部分注釋,再開始寫演算法 如果你採用的就是這種方式,那麼恭喜你,你已經學會了,可以完全不看這篇文章,因為下面都是陳述這種方式能帶來的好處以及用其他方式的缺點,如果你採用的不是這種注釋方式,那麼建議你瀏覽一下這篇文章,說不定會提公升你的編碼效率 一般在看到演算法題都會先在腦...