刷leetcode吃力正常嗎?

花落♡KicaZ莫相離


為了避免頭條用戶覺得我的回答裝逼,先貼一下自己的 GitHub 地址,

目前 20 k star。

<strong>

https://github.com/MisterBooo/LeetCodeAnimation

刷 LeetCode 的大局觀

目前主流的刷題流派有兩種,一種【龜系】,一種【兔系】。

“龜系”刷法的精髓就是每個題目都做乾淨。不滿足於一種解法,各種解法都寫一寫。這種流派適合不太急於準備算法面試的小夥伴,追求算法的乾淨優雅。

“兔系”刷法的精髓是暴力,按照標籤來刷,使用固定套路來刷。比如小吳之前分析的那道拍案叫絕的算法題,如果告訴你是標籤是異或,你馬上能 AC 。這都是套路。

每個標籤內部可以按照 Easy 、Medium、Hard 的順序做,算法練習是一個系統工程,不要一開始就追求難題,先熟悉熟悉套路,循序漸進的去做,後面所謂的難題也就不在話下。

建議小夥伴第一遍刷題可以使用 【兔系】 法。

看懂題目

萬事開頭難,看懂題目是做好一道算法題最開始也是最重要的一步。

我將 LeetCode 上的題大致分為三種類型:

•考察數據結構,比如鏈表、棧、隊列、哈希表、圖、Trie、二叉樹等

•考察基礎算法,比如深度優先、廣度優先、二分查找、遞歸等

•考察基本算法思想:遞歸、分治、回溯搜索、貪心、動態規劃等

一些算法題目會在標題或題目描述中給出明確的題目類型信息,比如二叉樹的重建、鏈表的反轉。

而有一些題目中則在條件中給予暗示 :

•設計一個 O(nlogn) 的算法(分治:在一顆搜索樹中完成任務,對於數據排序)

•給定一個有序數組(二分法)

•無需考慮額外的空間(用空間換時間上的優化)

•數據規模大概是 10000(O(n^2)就可以)

•問題可以被遞歸解決(動態規劃)

無論怎樣,當你拿到一道算法題的時候,希望你能先去弄明白這道題目要考察的是什麼,是簡單的數據結構還是複雜的算法思想。

先去理清題目背後解法要用的技術,這樣,這道算法題目才有做下去的可能。

不要忽視暴力解法

一般來說,BAT 等大廠的算法面試題基本上都是 Medium 級別及以下,並希望面試者能在 20 分鐘以內給出一個「相對正確」的回答。

為什麼說是 相對正確 ?

每一道算法題得解法都有很多種,並不是說你沒有給出完美解或者最優解你就是錯的。

“正確” 本身是一個相對概念。

在算法面試或者平時的算法練習時,如果沒有頭緒,可以嘗試使用暴力解法。

(不要忽視暴力解法。暴力解法通常是思考的起點。)

當你使用了暴力解法之後,可以與面試官進行溝通優化,把這個過程看作是和麵試官一起探討一個問題的解決方案的過程,這也可以讓面試官瞭解你的思考問題的方式。這也是一個“正確”的回答方式。

先實現功能再去優化。

Done is better than perfect 。

實際編寫

到這一步就是算法的落地了:將上面的思考結果思路轉換為代碼。

在編寫的過程中需要注意題目中的邊界條件,比如數組是否為空,指針是否為 NULL;同時也要注意代碼的規範性:變量名,模塊化,複用性。

做好總結

一定要做好總結,特別是當沒有解出題來,沒有思路的時候,一定要通過結束階段的總結來反思犯了什麼錯誤。解出來了也一定要總結題目的特點,題目中哪些要素是解出該題的關鍵。不做總結的話,花掉的時間所得到的收穫通常只有 50% 左右。

在題目完成後,要特別注意總結此題最後是歸納到哪種類型中,它在這種類型中的獨特之處是什麼。經過總結,這樣題目才會變成你在此問題域中的積累。

做好總結,讓每道題都有最大的收穫。一個月之後自己的狀態應該會有很大變化。[1]

最後,承認刷 LeetCode 很吃力很正常

你我都是普通的程序員,不像那些玩 ACM,拳打 LeetCode,腳踩劍指 offer,我們得接受現實:刷題,就是很痛苦很打擊的過程。

但,一遍一遍的刷,多刷一題就多掌握一題,你總會比別人更強一點。

大家一起加油:)

歡迎關注「五分鐘學算法」,和程序員小吳一起來學算法!


<strong>


五分鐘學算法


目前刷了151/824道題,剛開始用python刷,後來面試調整,改用C++

  1. 工作使用Objective-C,但說實在的用它刷題,簡直了自找苦吃。C++還都是學校學的,還是個選修課,也沒怎麼好好上,有時候也想看看書系統學一下,但覺得太浪費時間,就直接硬抗,好在大部分都是集合類,字符串處理什麼的。還勉強應付的了
  2. 剛開始只刷簡單的題,結果不到50道,卡了,簡單的都這麼吃力,自信心完全沒了,扔了半年
  3. 後來學會了各個擊破,鏈表,二分法,廣度優先搜索還比較簡單。其他的比如遞歸,深度優先搜索,子數組問題,哈希,動態規劃什麼的,幾乎都要看答案,新題要是能自己想出來,別提有多高興了, 實際情況都是看答案也看不懂,copy到IDE裡面一點點調試,和自己寫的對比。有時就差一個字符,結果千差萬別。
  4. 記得使用Anki,發現好多高人都用它記錄,一天感覺新題可以過3道,老題能過8道左右。不知不覺,就成長了,雖然目前還是個渣渣,但已經能看到進步了。在論壇上看到有大神一天能刷60道題,希望我也可以吧
  5. 我在Github上有個Repo,也收集了一些不錯的資源,主要用來記錄每天刷了多少,給自己點遊戲的任務感覺吧,畢竟刷題很難,特別容易放棄。還有好多題不止一個答案,而我卻一個也沒想出來。這時我會放過自己,寫個TODO: XXX以後再完成


PS: 關於如何使用Anki ?

我並沒有將代碼貼到卡片中,背代碼是不現實的,需要記憶的只是其中的題型+解題思路,每刷一道題,就會把題號+題目的類型放入到卡片中,遇到的坑什麼的也會記錄起來。

複習的時候,再手寫一遍。遇到新問題就追加到反面,例如:

正面:

215.kth-largest-element-in-an-array

反面:

quick-selection


天才小飛貓




leetcode中文叫力扣,是算法愛好者和學習者的必備社區。本人也是程序員,算法功底也不行 前陣子接觸到這個算法社區,覺得很有意思,值得大家上去刷題。下面是找到力扣的官網:



力扣上的算法題有初級有高級,還經常設置非常多的算法比賽,還有各種排名,剛開始玩這個社區的人建議不要好高騖遠,先把初級算法題刷到熟練再層層遞增,到了可以把刷題做到遊刃有餘的時候,會有機會拿到意想不到的成就甚至互聯網巨頭的入職機會。

下圖是在力扣裡編程的代碼:



關注“極客宇文氏”,一名熱心有料的軟件工程師。

極客宇文氏


c++ primer plus 過了一遍,不代表就能輕鬆應付leetcode的題目哦。

刷leetcode除了需要對使用有的編程語言很瞭解,還需要熟練掌握各類常用算法。

leetcode題量很大,建議分知識點刷,可以先刷“數組”,“字符串”這種題量比較大的

刷完一個知識點,要及時歸納總結。

記住,刷題不是為了追求數量,而是要通過刷題,熟練地掌握每個知識點。

另外,建議先看看《劍指offer》這本書,它對很多題型進行總結,刷過一遍再來刷leetcode相信會輕鬆不少。

歡迎關注“玩嗨大數據”,一起愉快刷題。


玩嗨大數據


剛刷的時候可能會有些吃力,刷多了就好些了


數據結構和算法


題主如果之前沒有刷題經驗的話對自己的表現不滿(自己覺得解題速度不夠快,標記成簡單的題因為各種原因不是一次AC,等等)完全是正常的。 即使是二刷三刷,如果隔了一段時間重新刷,對自己的手感不滿也是正常的。

獨自刷題不易,但是我們可以抱團取暖呀,github.com/Jiansen/Coder ,入群與其他小夥伴一起戰鬥吧。


Leetcode


難點在於實現各種樹結構,其實原理大家都知道。但能否寫出來確實很考驗代碼能力。


三袋大菠蘿


看c++的書對刷leetcode幫助不大,建議看幾本算法書,首推《算法導論》。

刷題的話可以先從簡單難度的開始,熟能生巧,刷的多了自然就覺得簡單了。

祝刷題愉快!


CodeTalk


說明你刷的少和你高考差不多,刷的題量上去了就輕鬆了


分享到:


相關文章: