我如何入门数据结构与算法丨刷算法一周年丨刷题习惯如何养成

2025年6月26日 - 10 min read
算法热力图

我如何入门数据结构与算法

分享一下我入门数据结构和算法的路径:

image.png

图中视频课都是在B站有资源的,我比较推荐的资源相关链接:Hello 算法电子版代码随想录代码随想录视频课

如果你想学习数据结构与算法,我有一个更好的路径推荐给你,可以让你在学习过程中有更缓的学习难度曲线,更好的去入门,并且不受编程语言的限制:

image.png 首先通过《Hello 算法》入门,构建整体的算法框架,再体系化学习算法,填充框架。《Hello 算法》里有清晰易懂的动画图解和可运行的代码示例(常见的语言示例都有),难度曲线合理,易使读者理解算法和数据结构的核心概念,并能够通过编程来实现它们。

hello_algo_header.png

这本书在 GitHub 上很火,已经有 114k 的 Star了。

同时该书有很多经典题可以在力扣找到,在学到时可以同步到力扣刷题,通过实践来验证所学的知识。

在体系化看完《Hello 算法》后,就可以进入到刷题阶段了。代码随想录把题型进行了分类,我们可以很好的根据类别来进行刷题。

image.png

代码随想录有文字版和视频版,相比文字,我更喜欢通过视频来学习知识。我刷题的步骤是:

  1. 根据代码随想录的刷题顺序,打开对应教程视频;
  2. 在力扣中打开视频对应的题,查看题目信息,自己可以先想一想解题思路,如果没有思路也没关系,这太正常不过了,我 95% 概率自己想不出来;
  3. 看教程视频里的解题思路;
  4. 跟着思路自己在力扣中实现并提交成功;
  5. 重复 1 - 4 步。

这里吐槽一下力扣题解的评论区,我总是能在里面看到贬低自己的评论,我觉得真的没必要,且这样做会让自己真的变蠢😅(因为大脑会把它当成指令或事实,不断重复这种说法,会强化你对自己的“蠢”的认知)。没有人一开始就会算法,且我们不是要去自己发明一套算法,而是去解算法题。能不能解开算法题的信息差就在于解题思路,只要你知道思路,就能解开。这与智力无关,与努力有关。右图是我解无重复字符的最长字串的早期记录,给大家看看缓解下焦虑😄。

image.pngimage.png

跟着代码随想录把整个算法体系都刷一遍之后,恭喜你,成功入门算法了,此时面试手撕算法对你来说应该不成问题了!

也许你会有学完后面忘掉前面的烦恼,重复练习可以让你的烦恼减轻,就像我制定「每日一道算法题」的每日任务一样,你也可以根据你的情况复习算法。如果你学习算法的目的是为了面试,那么我推荐你这个网站:CodeTop,它支持按公司部门岗位组合查询算法题考察频次数据,方便大家高效检索练习。

刷算法一周年

86ebe267e44aa9bfe0b218051ab0f0b.png

从一年前入门算法到现在,也有一年了,这期间的酸甜苦辣只有自己知道😇。7 月绿到发黑的热力图一定程度上反映了我当时找工作的心切和焦虑;8、9 月断断续续的绿点,是我找到工作后想更进一步,在 “把刷算法题培养成习惯” 和 “好累,能不能放过我这一次” 的想法间反复横跳的证明;而当我成功养成习惯后,打卡记录逐渐趋于稳定,即便零星有空白也会在第二天补上(我甚至在旅游期间都每天做算法题,不得不夸下自己我太牛了😄)。

一开始学习算法是为了找到更好的工作,因为大厂面试中算法是必考内容。成功找到工作后,我想把「每日刷一道算法题」培养成习惯,这有两个好处:一是理解和编写优秀代码的能力 —— 虽然实际工作中极少需要自己实现完整算法,但抽象程度高的代码实现都有着算法的参与,比如二分法、递归、优先队列等,数据结构与算法的思想能帮助我更好地理解源码;二是若以后工作有变动,就不至于需要花费大量时间重新学习算法。

刷题习惯如何养成

将「刷算法题」培养成习惯不是一件简单的事情,刷题是枯燥的,算法是困难的,两者光是组合在一起就让人感到痛苦😫。那看起来不太可能实现的习惯,我是如何办到的呢?其实我只是遵循一个非常简单易懂的准则使它易于实现

细心的朋友可能已经发现了,我在上文制定的习惯目标是「每日只刷一道算法题」,目的就是为了减少我的负担,让我觉得这是一个不会耗费太多时间的事情。并且,我没有规定刷算法题的难度,同样减少我的负担——大部分时间我解答的都是简单、中等题,我解答的困难题仅仅只有 17 个。

image.png

更过分的是,我没有规定不能重复刷一道题,这样一是可以加深对某些面试高频题的理解,二是依旧减少我的负担——力扣上我无重复字符的最长字串整整提交了 27 次😄。

image.png

以上种种做法,都是在为了在培养习惯时让其易于实现。“我不想每天在算法题花费太多时间”,没关系,每天只做一道题就行;“我觉得算法题好难,我 cover 不住”,没关系,做个简单题或者复习做过的题就行;“我昨天太忙了没时间做算法题,热力图上已经出现空白了,好烦,想摆烂了”,没关系,中断很正常,不必执着于完美,降低实现难度今天补上就行;“今天只有最后 2 分钟就过去了,来不及了怎么办”,没关系,哪怕花 1 分钟去提交之前写的代码,也比不做强,不在于你做了多少,而在于你有没有形成“惯性”。

当然,系统地养成习惯不止让习惯易于实现(我认为这是最重要的一点),尽可能做到:

  1. 明确习惯目标:越具体越好

    不要:「我要刷算法」

    要:「每日刷一道算法题」

  2. 绑定触发器(环境 or 时间)

    让这个习惯有“起点” —— 用已有行为触发它。

    例如我的触发器有:

    • 工作期间午休 or 晚休期间 -> 刷一道算法题
    • 在飞书设置每日定时任务,未完成提醒 -> 刷一道算法题
  3. 让习惯易于实现,坚持重复

    哪怕每天做1分钟,也比不做强,形成“惯性”

  4. 即时奖励:让大脑期待这个行为

    做完后奖励自己,例如完成该飞书任务、打会游戏

  5. 允许失败但保持回归

    中断很正常,别因此自责或放弃,如果失败了,找出原因并及时调整,例如:

    • 算法题要做很久 -> 降低难度从简单题做起