精通一个领域(数据结构与算法)
-
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 小时的时间以后,再次重复做题
- 不同解法的熟练程度 ——> 专项练习
刷题第四遍
- 过了一周之后: 反复回来练习相同的题目
刷题第五遍
面试前一周恢复性的训练