根据一本书中所讲的:《异类:不一样的成功启示录》,我们学习一项技术或者精通一个领域一定要经过 3 个阶段。

  • Chunk it up
  • Deliberate Practicing
  • Feedback

中文意思是:

  • 切碎知识点
  • 刻意练习
  • 反馈

下面我们就这几个方面来探讨如何正确的刷题:

本文重点来探讨第二点,也就是刻意练习,这也是刷题行为的核心。

一、Deliberate Practicing

刷题其实就是刻意练习,只有通过不断的练习,我们才能形成条件反射,做到有问必答,看到一个题目立马想出几种解决方案。

下面的方法取自极客时间

1、练习缺陷、弱点地方

这句话的意思就是我们要做就做自己不会的题目,如果一直做自己会的题目,你不会有进步的,所以不要一直刷那些 easy 的题目,时不时做个 hard 有助于提升自己的能力。

这其实可以扯到心理学,就是我们往往有一个舒适区,在这个舒适区里面我们不会感到累,做事情感觉很舒服,但是做这些事情其实并不会给你带来进步,你只有走出舒适区了,做那些让你感到不舒服,让你感到头疼的事情,才能进步。

这就像体育运动一样,我平时喜欢跑步,我的舒适区在 5 km 每小时左右,在这个速度下我可以一直跑下去而不会感到疲倦,但是跑了很久发现,就算我跑一年也还是这个速度,因为我一直都在自己的舒适区中。

而当我加速的时候,我可能坚持个几分钟就不行了,所以有时候我变懒了就不会去加速,看着似乎在运动,其实没有什么运动,这也就是为什么有些人减肥或者练肌肉永远达不到效果的原因,你只有让你的肌肉感觉到疼了,这才说明它正在长,而大多数人会在这个时候选择放弃。

所以刷题的时候你可能遇到一道题看了半天都不会就放弃了,我不建议看了半天就放弃,更不建议一道题看半天,这就是我接下来要讲的学会放弃。

2、刻意练习——过遍数

这里提倡一道题至少 5 遍。

第一遍

拿到一道题目,先观察题目,尽可能多的想几种解法。

如果想不出更好地,就直接 大暴搜。搜完之后自己尝试优化自己的代码。然后看题解,学习别人的代码。

如果在刚开始的 5 分钟之内想不出任何一种解法直接看题解,对的,因为我们不会就是不会,要学会放弃,我们不可能发明出一种算法,我们是学习算法所以没必要浪费时间想半天该怎么做。

第二遍

看完题解之后马上自己写代码,这个时候不能再看题解了,自己完成 AC。

多种解法比较,体会并优化。

第三遍

过了一天之后,再重复做题。

根据不同解法的掌握程度来做专项练习

第四遍

过了一周之后,反复来回练习相同的题目。

第五遍

面试前一周恢复性训练。

3、反馈

这里的反馈就是你学习了这个东西之后有什么收获,比如你可以完成类似的题目,你可以将解题思路讲给别人听。

学习了一个知识之后只有做到能够讲给别人听懂了才能说明你真正掌握了。

二、学习方法

关于力扣

力扣有两个网站,一个是中国站,一个是国际站,他们之间的唯一的区别就是域名,随便拿一道题目来说,国内站点的 URL 仅仅是多了一个 -cn,所以我们可以直接去掉这个字符来访问相同题目的国外站点。

  • https://leetcode-cn.com/problems/valid-palindrome/
  • https://leetcode.com/problems/valid-palindrome/

那么为什么要访问国外站点呢,还有的人居然说 无法访问

因为国际站点与国内站点有一个地方不一样就是:


每道题目后面都有一个 discuss,也就是讨论,这里面都是一些世界顶尖的大牛发表的一些解法,国内很多题解也是参考的这里的,尽管是英文,但是我们大多数情况下只需要看代码就可以了。

进去之后先点击 discuss,然后点击 Most votes ,代表按照票数高低进行排序,我们保证看前 3 个就可以了,这样你就会对这道题目理解的更深刻,掌握更多的技巧,欣赏别人的代码。

你常常会感叹,哇!居然还可以这样写代码 ?


旧知识 > 新知识

旧知识 > 新知识 什么意思? 这里主要想强调一下复习的重要性,以我自己为例,我在学习的时候比如看书或者看视频的时候,我会很在意看书的页数和看视频的进度,我一般会在每天早上把自己的学习计划列出来,这有好处也有坏处。

好处就是清楚的知道自己今天要学什么有条理,坏处就是你会刻意的去完成这个计划,比如有一些地方比较难,显然你列出这个计划的时候并不知道这一块内容很难,所以分配的时间较少,这就导致你可能会为了完成计划而不深入去理解这一块比较难的内容。

但是看完了整本书之后会发现,前面的几乎全忘了,这是为什么,这是很正常的,因为你不可能过目不忘,所以复习很重要,这就是学习方法,为什么有的人事半功倍,就体现在学习方法上,学习任何一下东西都是这个道理。

好的学习方法应该是学了新知识之后及时的回头复习旧知识,至于什么时候回头看,这个是因人而异的,你可能听说过艾宾浩斯记忆曲线,但是这个是不准确的,每个人都不一样,我的建议是先是隔一天就去回头看,然后隔一周、两周、一个月······

不要太在意学习进度,只要你每天学了,每天都在进步,这就足够了,急于求成往往适得其反。

举个例子,看完一本书大概需要多长时间?

以我自己来看,如果是一直看的话,一本中等厚度的技术书籍大概花两三天就可以看完,但是,看完之后又能记住多少,有多少是自己的东西,这个相信大家都清楚。

比如《算法 4》这本书,专门花一个月的时间来吃透这本书一点也不夸张,因为只看是没有用的,书上的例题、后面的练习题都要自己做,而且还要及时的复习才有可能掌握。

同样是看完了一本书,不同的人花不同的时间所获得的收获是截然不同的,所以别再自欺欺人了,既然看了,就要舍得花时间,勤能补拙说的一点也没错。