活跃农民
- 积分
- 506
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2020-10-17
- 最后登录
- 1970-1-1
|
第二章 刷题笔记体系
胖头龙推荐使用完整的笔记系统来记录我们已经刷过的题目内容。
有些同学会觉得题目直接刷不就行了?还花时间整这些没用的?
对于一些几个小时的任务,直接莽一波确实没太大问题;但是刷题是一个几百上千小时的任务,多花一些时间在笔记和整理上,长远看来会有事半功倍的效果。
做笔记的好处
(1)方便查找、记录:
很多时候我们做完、想明白一道题以后其实很快就会遗忘(领悟一时爽,事后忘光光)。
其实在思考过程中,我们会有一些很好的结论和过程,值得及时记下来。
虽然可以通过查看leetcode的submission来查看过往提交的代码,但是这样效率比较低,而且debug次数多的话,会把自己弄混。
所以记录一个属于自己的“golden” 答案是有必要的。
(2)方便复习过题
整理过的笔记对于复习过题非常有价值,只需要点开相应的标签(分类或优先级),可以在几个小时内回顾几十道题的思路、要点和解法,对于加深记忆有奇效。
(3)方便下次找工作
在“前言”部分也提到过,作为一个程序员,从毕业到工作十年左右,你可能需要找三四次工作,而且基本都逃不过算法面试。
因此,这次准备的笔记,以后都可以使用。
(4)培养良好工作习惯
作者在几家公司工作过几年,身边很多正例、反例都说明一个有条理的员工是非常受欢迎的,无论是对老板还是同事。
不思考、不总结、上来就莽代码,想到哪做到哪的工作风格会让别人十分头痛,对你自己也没有好处。
Organized是一个工程师的基本素养,而且这和move fast并不冲突。
在本文的刷题笔记里,作者把每道题写成一页笔记,并且打上不同的标签。这样我们可以根据不同标签来快速查找分类题目。
我自己用的Evernote(不是广告,纯粹因为当年找了一个名气还可以而且免费的,你可以用你喜欢的任何App),比较喜欢里面的多标签功能。
一开始我十分痛苦它为什么不使用hierarchy 的 文件夹形式,后来发现扁平的 notes 外加 hierarchy 的 tag 反而更高效,因为这样同一篇note 可以出现在不同的 Tag Tree 里,非常方便。
标签分类
按题目类型分:
Binary Search, BFS, DFS...等算法分类,同时在按数据类型分,就像leetcode的标签一样,每道题因为有多重属性所以可以打上多个标签。
按重要性分:
在“前言”里面也说了,作者把题目分为四个优先级,所以刷题力度也不同:
<1> 必背,大约20~30道,都是各类型题目的典型模板题,基本需要刷十几遍,做到迷迷糊糊半昏迷状态也能熟练默写的肌肉记忆状态。
<2> 核心,大约100~150道,主要是各种高频题和经典题,基本在5~8遍以上,需要做到最优解,medium难度10分钟以内,hard难度15分钟以内,无错一遍过,同时要能解释清楚思路。另外有多重解法的也要掌握,知道不同解法间的优缺点和trade off原因。
<3> 重点,大约200~300道,核心题之外的高频题,基本在5遍左右。这样遇到原题或者类似题的时候,基本思路、逻辑不会错。能不能临场完全bug free要看基本功和运气。
<4> 普通,上述题之外所有你刷过的题。基本上做过一两遍,有个思路,临场遇见了不会慌。
当然你也可以创建更多的分类,比如难度、公司什么的,看你自己的需要。
进行过题复习的时候,直接点开某一类标签,然后几分钟过一题,非常有效率。
一些标签示例(之前截的图,有些中英文混用了,请忽略这个细节):
笔记内容
每一题记录为一页笔记。
首先会抄下题号、难度、链接和截图题面。这样的好处是复习的时候不用再点开leetcode,省时间。
其次作者一般会添加这几个部分内容:
讨论澄清:
这个其实也是你需要和面试官clarify的内容。
因为实际面试不会像leetcode把一道题明明白白的摆在你面前,而是先给你一个模糊的描述,需要你问问题、讨论逐步细化明确需求。
所以在平时做题的时候,多想一想这些问题,对面试非常有帮助。
一个小tip,leetcode题目里面的notes,constraints 很多时候就是我们面试中需要先澄清的问题。
仔细想一想为什么要加这些条件,如果不加的话题目解法会出现什么样的变化,带着这样的思路去看题,也就知道面试的时候需要clarify什么了。
解法思路:
如果有多重解法,分开写。
对于每一种解法,描述一下核心思路和主要解法步骤。
其实这也是面试中,你向面试官简要描述你的解法的过程,对着屏幕自言自语练一练。
注意要点:
代码实现中需要注意的细节,这主要来自于你写这道题是遇到的具体问题,和 debug中领悟的要点,往往也是易错点或者比较tricky的地方。
复杂度:
常见的复杂度分析,每次做题想一想,分析一遍,自然就熟悉了。
同时也是不同算法之间trade off重要准则。
代码:
贴上你自己准备的"golden"答案,一方面方便复习,同时也促进了代码风格的形成。
下面是一个笔记的例子,因为优先级相对较高,所以写的比较细。
其实不用每题都写这么复杂,抓准每题的重点即可。
也不需要一次性写这么多,很多内容实在反复刷反复想的过程中逐步添加的。
这个例子里面有三个标签:Pointers-array,Heap,优先级2_核心。
刷题记录表
除了分类笔记,我们还需要一张总体的刷题表来记录自己当前的状态。
它可以帮助我们一目了然的看出哪些题我们做的还不够,下一步需要加强哪些方向。
这张表包含:
要求:必背,核心,重点,普通,分别用不同颜色区分,方便观察。
题目链接:指向leetcode的链接,并用颜色区分的难度。
分类:分类标签。
当前刷题状态:
包括最近刷题、过题的一些信息。特别是最近一次的写题时长和重交次数,这个决定刷题状态的颜色条:
深红:连答案都没看懂。
浅红:最终提交通过,但是时间太长或者重交次数过多(简单/中等超过10min,hard超过15min, 重交达到2次且有逻辑漏洞)。
黄色:第一次能在规定时间内完成,顶多有一两个typo造成的错误。
绿色:连续两次按时无错通过。
备注:一些其他信息,灵活使用,比如某题是其他题的follow up之类的。
截图一个之前的栗子:
一开始可能很空旷而且都是红色,后来渐渐变绿就越来越稳了。
以上就是胖头龙记笔记时的一些要点。
之前有同学建议胖头龙可以把刷题记录表和计划表(后面章节会提到)做成一个小App,方便大家使用,但确实业余时间有限,最近看来是没戏了。
其实具体形式不是最关键的,重要的是学习、工作的时候,形成一套自己的信息总结体系,做一个有条理的工程师。
|
|