精通一個領域(數據結構與算法)
-
Chunk it up 切碎知識點
數據結構(https://naotu.baidu.com/file/b832f043e2ead159d584cca4efb19703?token=7a6a56eb2630548c)
庖丁解牛 把數據結構的一個又一個知識點分解開來
It is important to view knowledge as sort of a semantic tree —— ElonMusk
覃超建議 把數據結構這么分:
- 一維數據結構
-
- 基礎:數組array (string),鏈表 linked list
- 高級:棧stack, 隊列queue, 雙端隊列deque, 集合set,映射map(hash or map), etc
- 二維數據結構
-
- 基礎:樹tree,圖graph
- 高級:二叉搜索樹 binary search tree(red-black tree, AVL),堆heap,並查集disjoint set,字典樹Trie,etc
- 特殊
-
- 位運算Bitwise,布隆過濾器BloomFilter
- LRU Cache
算法(所有這些復雜的算法,其實到了最后就是找它的重復單元是什么???)(https://naotu.baidu.com/file/0a53d3a5343bd86375f348b2831d3610?token=5ab1de1c90d5f3ec)
-
if-else, switch -> Branch
-
for, while loop -> Iteration
-
遞歸 Recursion(Divide & Conquer, Backtrace)
-
這里做個分割 下面的就是一些高級一點的算法
-
搜索 Search:深度優先搜索 Depth first search,廣度優先搜索Breadth first search,A*, etc
-
動態規划 Dynamic Programming
-
二分查找 Binary Search
-
貪心 Greedy
-
數學 Math,幾何 Geometry
注意:在頭腦中回憶上面每種算法的思想和代碼模版
(動手繪制腦圖去)
-
Deliberate Practicing 刻意練習
- 基本功練習(基本功是區分業余和職業選手的根本)
- 基礎動作的分解訓練和反復練習 ——>>最大的誤區(如果你做一個算法題,如果你只做一遍,這就是你進行練習和切題的最大誤區,這是遠遠不夠的)
- 刻意練習——過遍數(五遍刷題,五毒神掌)
- 練習缺陷、弱點地方走出自己的舒適區(枯燥 無味 煩躁 就是成長)一只腳踏在舒適區之外
- 職業化訓練 CSGO 開一些專項練習的地圖(自己就練過233333,無論是CS還是CS go)
- 奧沙利文是真的牛逼
- 別怕動態規划啥的 經過幾十題的練習 肯定就很熟練了
-
Feedback 反饋
- 即時反饋
- 主動型反饋(自己去找)
- 高手代碼(GitHub, LeetCode, etc)
- 第一視角直播
- 被動式反饋(高手給你指點(現在這點對於我來說有點難啊,只能多去找朋友了))
- code review
LeetCode上面有很多別人寫的非常好的代碼
刷題的方式(切題四件套)
Clarification(多看幾遍題目 && 和面試官多溝通,確保自己對題目的理解是對的)
把題目看清楚 題目要干嘛 很重要
Possible Solutions
所有可能的想法。不要只用想到的第一種解法去解。要去用所有可能想到的方法,從中找出最優解法
- compate (time / space)
- optimal (加強)
Coding(多寫)
Test cases(測試用例要多寫幾個,給面試官大人感覺,自己要有始有終)
五毒神掌
刷題第一遍
- 五分鍾:讀題 + 思考 (如果基礎薄弱 可以給自己10分鍾 最多15分鍾)這里不能略過
- 有思路 直接做 直接寫 || 超時 ——>> 直接看解法!注意!多解法,比較解法優劣(理解學習和運用算法 不是讓你去造輪子)
- 背誦、默寫這樣好的寫法(並不是死記硬背即可,先背誦記住了之后,一般來說肯定就能理解了。很多題目以后看到就條件反射了)(不能打擊自己的積極性)
刷題第二遍
- 馬上自己寫(一開始可能會有bug 沒關系 debug debug debug 修改修改修改) ——>LeetCode提交
- 多種寫法、體會 ——>優化!(最重要的是執行時間)
刷題第三遍
- 過了24 小時的時間以后,再次重復做題
- 不同解法的熟練程度 ——> 專項練習
刷題第四遍
- 過了一周之后: 反復回來練習相同的題目
刷題第五遍
面試前一周恢復性的訓練