指导学习(二)

今天是小浩算法“365刷题计划” - 刷题指导篇(小白篇)。 三年高考,五年刷题。leetcode不算从其他各处收录的题目,单就自己的题库,总共有1600+,如果按照每天刷一道的话,总共需要5年。那我们真的需要把这些题目全部刷完吗?如果不是,刷多少合适?又该怎么刷呢?本文我尽量言简意赅,直击大家的疑惑。(本文适合算法初学者)

01、刷多少题

不下百人问过我这个问题。我的建议是,对于大部分的人,200道是一个合适的数字。


估计到这里,有人会喷我。你不设前提,不谈目的,直接就说200道,这不是扯淡吗。我想说的是,这不是扯淡。


前面我已经说了,对于大部分人,我的建议是200道。大部分人指的是什么呢?我这里统指没有系统刷题经验的同学。无论是工作3-5年的职场老司机,还是即将毕业的应届生,只要没怎么刷过题,通通归为此类。


对于上面这个群体(请先自行判断是否可以归为此类),刷题的目的基本是为了面试。不管我多么巧舌如簧,告诉你算法可以提高思维,增强逻辑,是成为top coder的必然条件,等等等等。但最终都还是会回归到这个目的:面试

PNG

所以现在我们换掉问题:没什么刷题经验的同学为了面试需要刷多少道题?我的答案是:200道。

02、为什么是200

这个问题,不妨换做 ”刷完200道题可以掌握到什么程度?“


常见tag无外乎那么七八种,200道题听起来很多,但是分散到每一个tag,每种也就只包含二三十个。倘若我们算多点,每一个tag包含30道题,其中大概是15-20道easy,5-10道medium,2-3道hard。200道不多不少,基本可以完美覆盖整个算法体系,所以我认为200道是一个不错的数字。


那么回到问题 “刷完200道题可以掌握到什么程度?” 我当然可以给你一些信心,告诉你200道题可以让你吊打面试官,完虐BAT。但是呢,其实这都是骗小孩子的,或者就是骗 ¥。那真实的200道题能让你到达一个什么程度呢?


  • 在算法方面超过大概80%的同行(这里单指基础算法,非ML、AI等)
  • 在面试时不至于对方拿出一道题目整个人就陷入懵逼,而是有资格享受面试思考题目的过程
  • 身边有朋友聊到算法敢过去和他们交流,而不是默默的走开
  • 对于应届生,谋取一份拿到offer的可能性
  • 对于老司机,去大厂镀金的必备条件
  • 对于培训生,极大的缩小和科班学生的差距

03、200道刷多久

“我之前立了个flag,一天刷一道都没坚持下来。你特么让我刷两百道,我一年都搞不定。这不扯淡吗?”


如果你有上面的疑惑,那么:你错了。坚持不下来一天一道的人和刷完200道题,毛关系都没有。回到我上面的例子,200道题目里。大概easy在130-150道左右,medium在30-50道,hard只占据了不到20道题。

PNG

跑步和刷题不同。跑步是越来越慢,刷题却是越来越快的。对于初学者(正常人),在每一个tag刷了10道左右简单题之后,基本同类型的题目可以提高到每天2-3道easy题目,有的掌握好的,甚至能提高到每天刷5-10题。很多同类型题目,基本都是一个模子刻出来的。


所以我认为,200道题刷的特别慢的话大概在150天左右完成,中不溜的在100天左右,刷的快的话在60天左右。同时,如果我们再把这里边的 medium 和 hard 通通remove 掉。再不济,也应该在3个月左右掌握大概100-150道简单题目。剩下的,just do it。

04、刷完就忘

你忘我也忘,大家都旺旺。


忘就对了。如果你在刷题的时候发现怎么也写不出来,别担心,这是正常的。如果你还发现,之前明明刷过的题,过段时间再做的时候,自己还是不会。别担心,这特么还是正常的。


作为一个正常人,大脑就会忘记,如果不忘,可能说明你大脑出了问题。这个不是我说的,是医生说的:


PNG


所以如果有些题你刷了好多遍都还是不会,那就需要进行总结。思考到底是哪一环节卡住了你,反复进行练习。当然,这里有人建议是每道题都刷个3遍,其实我觉得倒是没有这个必要。我建议是找个小本本,记一下每一道的核心要素与考察要点。在刷题的这段时间里,没啥事就瞅瞅翻翻。

05、没基础怎么办

我没学过算法和数据结构,能不能刷题?


能。刷题本身就是一个学习的过程。比如二叉树的题,刷个30道,你一定会遇到BST。所以我个人认为学习系统的算法知识(也就是你们问我的,要不要买一本书,先看一遍再进行刷题)和 刷题 本身并不矛盾。你可以双管齐下,也可以单点突破,都ok。主要是,干就对了。

PNG

到这里就会出现另一个问题,“我是从头刷,还是分类刷?” 我的建议是,如果稍微有点算法基础,你就从头刷leetcode前200道题。如果完全没有算法基础,可以考虑分tag来刷。并不是说按照tag的方式更好,而是在没有算法基础的前提下分tag来刷,除了掌握题型之外,对于知识的掌握很有益处。(想一想初高中是如何学习的)那为什么又说从头刷也是可以的?这个是因为,如果一直刷某一种类型的题,容易出现刷完一类忘掉前一类的问题,也容易对某一类题目疲惫。总之,使用哪种方式取决于你。关键是:干就对了!


另外,我认为leetcode前200题是相当经典的。可能大家不知道,早期leetcode总共也就一百来道题。这些题目基本都是精华,后面的很多题目都是在这些题目的基础上进行演化而成。比如 合并两个有序链表,后来就演化成 合并K个有序链表。并且前200道题基本覆盖了所有的算法类型,我是很建议大家刷一遍的。

06、其他

初学者拿到题目没有思路怎么办?为什么看完题解自己还是写不出来?别人的代码为什么可以那么简单?为了面试要不要尽可能多的掌握最优解?等等等等,这些我打算出在下一次的算法指导篇中。

今天基本就到这里了,还有很多想和大家说的,后面我再一一分享出来。如果意犹未尽,那么下面这篇文章是必看的:

算法指导篇