活跃农民
- 积分
- 506
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2020-10-17
- 最后登录
- 1970-1-1
|
第三章 刷题方法
基本思路
作为小白刚入门的时候,第一反应以为所谓刷500题就是把 LeetCode 上面前500题都做一遍;再后来有些经验了意识到刷一遍是不够的,基本做了就忘记了,所以需要刷5遍,也就是500 x 5的由来。
这样也对,也不对。
对于大部分资质平均水平的同学而言,刷题确实需要反复训练领悟,但是反复训练不代表死板的暴力重复。当然,暴力重复确实会有作用,但是有系统、有方法的学习,一般来说会更有效率。
就像背单词一样,每个单词花5分钟读300遍未必是最好办法,间隔多天的反复学习反而效果会更好,因为我们需要尊重大脑的工作方式和记忆方式。
所以坐着不但强调刷题要分类,分重点,同时也要分阶段使用不同的方法,实现螺旋形上升的学习过程。
简单的说,就是新手状态只需要囫囵吞枣,不求甚解;稍微有些经验之后再深入思考,恍然大悟;重点题目都基本理解之后再扩展范围,反复训练;最后在不断的、轻重结合的反复训练中实现融会贯通,能做能说。
也就是相比于简单粗暴的依次刷题,循序渐进的循环刷题效率可能更高。
以下图为例,就是越核心的题目重复的次数越多,掌握的程度越深,熟练度也越高。
从刷题频次上来看,更接近于 30 * 10 + 100 * 8 + 300 * 5 。
这样不仅学习效果更好,对于面试准备也更友善。
因为即便你只处于第二层境界的状态,也已经拥有了相对完整的知识体系,可以应付一些要求不那么高的面试。
刷题模式
刚才提到轻重结合就是指刷题力度不同,这个概念在序言里面已经提到过,这里再重复一下(稍作修改)不同刷题模式:
初刷:
新手期遇到新题,如果短时间内(五分钟)没有思路没关系,不要死缠烂打,早点看答案。
找到最优的答案并尽力去理解,用自己的面试语言和规范的代码风格进行“抄写”,不完全懂也没关系,标注一下,以后再看。
每题时长控制在半小时之内。
精刷:
针对初刷过还未充分理解的题。
尽量全面理解答案的要义,并且至少在能自己“默写”出来,并调试通过。
将解题思路和形成的标准答案加入到笔记当中。
如果实在不能完全领悟,需要在笔记中用显著符号标注该题,写下困惑的地方,过一段时间再试试看。
每题时长控制在一小时之内。
复刷:
针对做过的题进行复习。
自言自语clarify题意,讲请楚自己的思路,写题,检查,跑case,争取bug free一遍过。
只有参考笔记和标准答案复盘自己的错误和不足。
每题时长控制在20分钟内。
回顾:
按照笔记的标签(比如按分类,或者按优先级)大量复习题目。
针对做过的题进行复习,如果对这一题还有映象,则在大脑中过一遍解题思路及实现中的细节要点。
如不记得,则进行主动思考寻求解法,之后对比之前的答案和笔记,看是否正确。
如果不正确则需要强化思考并记忆,不需要写题。
每题时长控制在5-10分钟内。
讲题:
在对此题解题思路正确的情况下,尝试在白板上画图并讲解自己的解题思路,看是否能够流畅完成此过程。
找到一个让自己满意的描述方式,将图表和讲题思路/要点加入到笔记当中。
模拟:
抽取一道新题,看能不能做到复刷中的效果目标。
把题目记入笔记。
每题时长控制在30分钟内。
刷题过程
每个人都可以根据自己的情况定制具体计划,这里给一个例子,是一个对于新手相对详细全面的螺旋型学习过程,可以根据自己的状态进行步骤的增减。
其中必背题大约30道,核心题大约100+,重点题大约200-300道。
(1)基本知识学习
要刷题首先得学会语言,新手起步一般是 Python 或者 Java。(当然刷题语言用什么这又是个引战无数的问题,没必要展开,因为各有优劣,所以自己爱用啥用啥,反正面试官一般都看得懂。作者自己一开始用的Java后来转用Python,因为一般来说大部分算法题的情况下 Python 会相对短一些,面试的时候省一些时间。)
语言学习需要理解这种语言的基本数据结构(Array, Linked List, Set, Map等等)、逻辑操作(if,else, for, while, continue,break, return 等等),然后再学习一些稍微复杂一些的数据结构(Stack, Queue, Tree, Heap等等),以及一些简单的 OOD 知识,比如关于Class的最基本的概念。
一般来说很多网站都有详细或者简单的教程。建议从简单好玩可互动的入门级教程开始上手,然后再去读相对复杂枯燥的讲解,最后也可以适当做一些入门题,就是Lintcode上Naive标签的题(LeetCode好像没有这个难度),熟悉一下最基本的写代码的感觉。
目标:知道if语句,for循环怎么写,基本数据的增删改查知道怎么处理。
(2)初刷必背+核心
分类学习各算法分类的基本概念和思路,以初刷模式刷一遍必备+核心题目(30 + 100左右)。
其中概念和思路要做到基本理解,但是题目一时半会无法完全理解很正常,把题号+题目+参考答案 按照第二章说的方式记在笔记里即可,刷题记录可以标记为深红(尚未理解)。
目标:知道算法大概有哪些门类,题目大概长什么样,都是在问些什么,总结100+题的答案,并收录在笔记里。
(3)精刷必背题
按分类尝试深入理解每个分类下面的必背题。
对于核心题可以按照初刷的方式再过一遍,看不懂就跳过。
目标:基本理解了必背题的解题思路。
(4)精刷核心题
尝试默写出必背题,对核心题使用精刷操作。
目标:能够基本写出必背题的答案,基本理解核心题的解题思路。(第一层境界)
(5)初刷重点题
按照分类对重点题使用初刷模式。
每道题自己先思考几分钟,有思路就先自己试一试,没思路就看答案,不管是否成功写对,最后都要找到标准答案。
目标:把重点题过一遍,至少知道前400题长什么样。
(6)复刷必背+核心
继续熟练默写必背题,并尝试讲题,包括clarify,描述思路,过一些test case。
尝试自己写出核心题。
目标:能都随手写出必背题;碰到核心题,都能有思路,虽然可能有小问题,但基本都能写出来。(第二层境界)
(7)精刷重点题 + 回顾必背、核心题
按照高频顺序(不再是分类)精刷重点题,如果觉得比较费时间,就从前往后刷到哪是哪。
同时回顾(过题)必备题和核心题,做过时间的比较久的重点题也可以放在回顾计划中。回顾时主要关注思路和实现要点、易错点。
目标:对于前300 ~ 400题形成相对完整的知识体系、笔记体系。
(8)复刷必背、核心题 + 回顾重点题
做到必背、核心题基本都能一次写对,尝试讲题。
目标: 能秒杀核心题。
(9)复刷重点题 + 回顾所有做过的题
如果重点题能直接做出来(可能只是一小部分),就对照一下之前的答案对比一下小的细节差异,如果五分钟没有思路,或者三十分钟没写对,直接看之前笔记的答案修正问题。
目标:对于重点题,也基本看到就都有思路。
(10)回顾所有做过的题 + 模拟
按频率或者面经,以模拟的形式尝试还没做过的题。
包括clarify,解法描述,写题,跑case等等。
不管有没有做对,都要看答案形成笔记。
目标:对于必背、核心题都可以秒杀并详细讲解;对于重点题可以在没有太大逻辑错误的情况下写对;对于400道以外的题目也做过一些,并且看到大部分新题都至少有思路。(第三层境界)
(10 +)回顾旧题 + 做新题
进入了一个开放性的成长阶段,面试能用到的理论体系已经完整建立,主流高频题都能搞定。
通过各种新题磨炼自己的临场技能,补充知识体系中的细节。
目标:前往第四层境界的路上。
刷题计划表
也可以定制一个自己的刷题计划表(不同于刷题记录表),方便计划和打卡。
一般来说,刷题这样的高脑力活动,一天4~6个小时效率会比较高。
超出的时间做一些知识学习、回顾旧题这样相对较轻松的任务会比较合适。
如果经常无法按时完成,需要及时调整。
注意劳逸结合。大脑和肌肉一样,练多了效率会降低,特别是对于二十多岁的中老年人。
把每天有限的心力及时用在最困难的任务上。
一些重复三遍的小建议:
学不明白不是你的错,是题目确实难
不要和某一题死磕太久
劳逸结合
能讲和能写一样重要;但是在会讲题之前,得先会写;会写之前,得先理解
按照现在的市场价格,学会一题相当于赚 $500,而且是每年
过程是艰难的,结果是美好的
到这里,前三章的基本方法和思路就差不多讲完了。
第四章开始总结分类列表。
|
|