「刷题经验」1000 题留念,附带我的刷题攻略

「刷题经验」1000 题留念,附带我的刷题攻略

0. 前言

前几天终于刷到 1000 题了,算是实现了自己的一个小目标。想借这个机会想跟大家分享一下我自己的刷题经验。

本文将跟大家分享一下自己在 LeetCode 刷题过程中的「前期准备」、「刷题顺序」、「刷题技巧」。

1. 自我介绍

1.1 简单介绍版

一名工作多年的 iOS / macOS 开发工程师。

大学期间学习过算法基础知识,参加过 3 年的 ACM 竞赛,但水平一般。

2021 年 3 月 30 ~ 2022 年 06 月 16 日,共计 443 天(约 14.7 个月)的时间在 LeetCode 上刷了 1000 多道算法题。

刷题过程中写了一本算法基础书,名字叫做「算法通关手册」(目前已完成 75%)。

1.2 复杂介绍版(有点啰嗦,可不看)

我是一名已经工作多年的 iOS / macOS 开发工程师。曾经在大学期间学习过算法基础知识,并且参加过 3 年的 ACM 竞赛(当然个人水平有限,常年铁牌水平)。虽然大学期间的 ACM 经历没有取得很理想的成绩,但是这 3 年的 ACM 经历,给我带来最大的收获是锻炼了自己的逻辑思维能力和解决实际问题的能力。

工作多年后再次拾起算法,开始刷 LeetCode 算法题是在 2021 年的 3 月底。那时候在朋友的怂恿下,我们拉了一个小群,制定了一个为期 3 个月的算法打卡计划(2021 年 4 月 ~ 6 月),这个计划的唯一规则就是: 连续两天不刷题就会被踢出群。

就这样我们一群小伙伴们(39 个人)开启了为期 3 个月的刷题计划。3 个月过后,最终只有 13 个人成功完成了刷题计划,另外三分之二的人都因为打卡失败被踢出群了。这些失败的人中也包括我自己,我是在计划即将结束的时候,一次周末忘记了打卡,惨遭淘汰。

虽然这次我的刷题计划失败了,但是经过这 3 个月的刷题练习,让我重新拾起了学习算法的乐趣,并且把刷题变成了自己的日常习惯。在工作之余,我总是习惯性的打开 LeetCode,刷上几道题,然后写下题解,这种感觉很充实也很有成就感。

在这次刷题计划结束之后,2021 年 7 月份的时候,我们重新建立了算法打卡群,并持续到了今天。

我们把打卡规则变化了一下,不再那么严苛。之前时长 3 个月的计划被改成了每月的刷题计划;连续 2 天不打卡就退群的规则也改为了每个月允许最多 4 天不打卡,超过 4 天当月就不再统计刷题数目,当然这个月失败之后,也不用再退群了,从下个月开始重新统计就好。

就这样,刷题打卡成了我们的日常,群里的小伙伴也越来越多。我们每天刷题,写题解,在群里讨论每日题目的思路,提出问题和回答问题、探讨更好的求解思路。再后来群里的一些小伙伴们开始参加周赛、双周赛,在比赛结束之后我们还会交流赛题思路、做题心得。

后来,某天我突然想到了大学时自己立下的 flag,如果我能把自己学到的算法知识总结起来,编辑成书,然后分享给想要学算法的朋友们看,那是不是会更有意义、会收获更大的成就感、并且也能在这个过程中让自己学到更多的算法知识呢?

说干就干,在写刷题、写题解的过程中,我又开始写算法和数据结构的基础知识。最开始的时候是写在自己的 github 仓库里边,后来学会了用 hugo 搭建网站,就又搭建了一个自己的算法电子书网站。

在写算法电子书的这个过程中,我发现一个秘籍:只有「输出」才是最好的学习方法。这也是「费曼学习法」的一个应用。

在写算法内容的时候,我如果对一个概念不理解,或者有点模糊,是不可能把它写清楚,并且也让别人看明白的。只有在参考大量的算法书籍和大佬的博客之后,把其中的概念或算法理解透彻了,彻底弄明白了,才能够通俗易懂的写出来。

并且在写书的过程中,会有很多朋友和网友留言,帮我指正错误或者提出建议,这些指正和建议,在很大程度上帮助我改进文章内容和提高自己对算法的理解。就好像是学生在写作业,有专业的老师在帮我批改作业,帮助我进步一样。

就这样,我从 2021 年 3 月 30 日开始重新刷题,刷到今天(2022年06月16日),14 个月(443 天)的时间已经在 LeetCode 上刷了 1000 多题。并且在刷题的过程总结了一些算法知识和数据结构知识,写了一本算法基础书,名字叫做「算法通关手册」(目前已完成 75%)。

以上是我个人刷题经历的一些碎碎念,下面开始正式分享我的刷题攻略。

2. 前期准备

如果你是一个对基础算法和数据结构完全不懂的小白,那么在刷 LeetCode 之前,建议先学习一下基础的 「数据结构」 和 「算法」 知识,这样在开始刷题的时候才不会那么痛苦。

基础的「数据结构」和「算法」知识包括:

常考的数据结构:数组、字符串、链表、树(如二叉树) 等。

常考的算法:枚举算法、递归算法、分治算法、回溯算法、贪心算法、动态规划 等。

这个阶段推荐看一些经典的算法基础书来进行学习。这里推荐一下我看过的感觉不错的算法书:

【书籍】「算法(第 4 版)- 谢路云 译」

【书籍】「大话数据结构 - 程杰 著」

【书籍】「趣学算法 - 陈小玉 著」

【书籍】「算法图解 - 袁国忠 译」

【书籍】「算法竞赛入门经典(第 2 版) - 刘汝佳 著」

【书籍】「数据结构与算法分析 - 冯舜玺 译」

【书籍】「算法导论(原书第 3 版) - 殷建平 / 徐云 / 王刚 / 刘晓光 / 苏明 / 邹恒明 / 王宏志 译」

当然,也可以直接看我写的「算法通关手册」,欢迎指正和提出建议,万分感谢。

「算法通关手册」GitHub 地址:https://github.com/itcharge/LeetCode-Py

「算法通关手册」电子书网站地址:https://algo.itcharge.cn

3. 刷题顺序

讲个笑话,从前有个人以为 LeetCode 的题目是按照难易程度排序的,所以他从「1. 两数之和」 开始刷题,结果他卡在了 「4. 寻找两个正序数组的中位数」这道困难题上。

LeetCode 的题目序号并不是按照难易程度进行排序的,所以除非硬核人士,强烈不建议按照序号顺序刷题。如果是新手刷题的话,推荐先从「简单」难度等级的算法题开始刷题。等简单题上手熟练之后,再开始按照标签类别,刷中等难度的题。中等难度的题刷差不多之后,可以考虑刷面试题或者难题。

其实 LeetCode 官方网站上就有整理好的题目不错的刷题清单。链接为:https://leetcode.cn/leetbook/。可以先刷这里边的题目卡片。我这里也做了一个整理。

推荐刷题顺序和目录如下:

1. 初级算法、2. 数组类算法、3. 数组和字符串、4. 链表类算法、5. 哈希表、6. 队列 & 栈、7. 递归、8. 二分查找、9. 二叉树、10. 中级算法、11. 高级算法、12. 算法面试题汇总

我之前刷过的 LeetBook 清单:

当然还可以通过官方新推出的「学习计划 - 力扣」按计划每天刷题。

或者按照我总结的分类刷题列表进行刷题:

「分类刷题列表(GitHub 版)」链接:点击打开「分类刷题列表(GitHub 版)」

「分类刷题列表(网页版)」链接:点击打开「分类刷题列表(网页版)」

正在准备面试、没有太多时间刷题的小伙伴,可以按照我总结的「LeetCode 面试最常考 100 题」、「LeetCode 面试最常考 200 题」进行刷题。

说明:「LeetCode 面试最常考 100 题」、「LeetCode 面试最常考 200 题」是笔者根据「CodeTop 企业题库」按频度从高到低进行筛选,并且去除了一部分 LeetCode 上没有的题目和重复题目后得到的题目清单。

「LeetCode 面试最常考 100 题(GitHub 版)」链接:点击打开「LeetCode 面试最常考 100 题(GitHub 版)」

「LeetCode 面试最常考 200 题(GitHub 版)」链接:点击打开「LeetCode 面试最常考 200 题(GitHub 版)」

「LeetCode 面试最常考 100 题(网页版)」链接:点击打开「LeetCode 面试最常考 100 题(网页版)」

「LeetCode 面试最常考 200 题(网页版)」链接:点击打开「LeetCode 面试最常考 200 题(网页版)」

4. 刷题技巧

下面分享一下我在刷题过程中用到的刷题技巧。简单来说,可以分为 5 条:

五分钟思考法

重复刷题

按专题分类刷题

写解题报告

坚持刷题

4.1 五分钟思考法

第一个技巧是 「五分钟思考法」。

「五分钟思考法」 的意思是:如果一道题如果 5 分钟之内有思路,就立即动手写代码解题。如果 5 分钟之后还没有思路,就直接去看题解。然后根据题解的思路,自己去实现代码。如果发现自己看了题解也无法实现代码,就认真阅读题解的代码,并理解代码的逻辑。

这种刷题方法其实跟英语里边的背单词过程是类似的。

一开始零基础学英语的时候,先学最简单的字母,不用纠结为什么这个字母这么写。然后学习简单的单词,也不用去纠结这个单词为啥就是这个意思,学就完事。在掌握了基本词汇之后,再去学习词组,学习短句子,然后长句子,再然后再看文章。

而且,在学英语单词的时候,也不是学一遍就会了。而是不断的重复练习、重复记忆加深印象。

算法刷题也是一样,零基础刷题的时候,不要过分纠结怎么自己就想不出来算法的解法,怎么就想不到更加高效的方法。遇到没有思路的题目,老老实实去看题解区的高赞题解,尽可能的让自己快速入门。

4.2 重复刷题

第二个技巧是 「重复刷题」。

算法题有时候一遍刷过去,过的时间长了可能就忘了,看到之前做的题不能够立马想到解题思路。这其实还是跟背单词一样,单词也不是看一遍就完全记住了。所以题目刷完一遍并不是结束了,还需要不断的回顾。

而且,一道题目可能有多种解法,还可能有好的算法思路。

最开始做的时候,可能只能想到一种思路,再做第二遍的时候,很有可能会想到了新的解法,新的优化方式等等。

所以,算法题在做完一遍之后遇见不会的,还可以多刷几遍,不断加深理解。

4.3 按专题分类刷题

第三个技巧是 「按专题分类刷题」。

在上边「3. 刷题顺序」我们给出了刷题顺序和目录。这里的刷题顺序其实就是按照不同分类来进行排序的。

我们可以在学习相关算法和数据结构知识时,顺便做一下该算法和数据结构知识专题下对应的题目清单。比如在学习完「链表」相关的基础知识时,可以将「链表」相关的基础题目刷完,或者刷官方 LeetBook 4. 链表类算法 中的对应题目。

按照专题分类刷题的第一个好处是:可以巩固刚学完的算法知识。如果是第一次学习对应的算法知识,刚学完可能对里边的相关知识理解的不够透彻,或者说可能会遗漏一些关键知识点,这时候可以通过刷对应题目的方式来帮助我们巩固刚学完的算法知识。

按照专题分类刷题的第二个好处是:可以提高刷题效率。因为同一类算法题目所用到的算法知识其实是相同或者相似的,同一种解题思路可以运用到多道题目中。通过不断求解同一类算法专题下的题目,可以大大的提升我们的刷题速度。

4.4 写解题报告

第四个技巧,也是我觉得最有用的技巧是 「写解题报告」。

刷算法题,有一个十分有用的技巧,就是 「写解题报告」。如果你刷完一道题,能把这道题的解题步骤,做题思路用通俗易懂的话写成解题报告,那么这道题就算是掌握了。这其实就相当于「费曼学习法」的思维。

这样,也可以减少刷题的遍数。如果在写题的时候遇到之前刷过的题,但一时之间没有思路的,就可以看看自己之前的解题报告。这样就节省了大量重复刷题的时间。

4.5 坚持刷题

第五个技巧,也是最后一个技巧是 「坚持刷题」。

算法刷题没有捷径,只有不断的刷题、总结,再刷题,再总结。千万不要相信很多机构宣传的「3 天带你精通数据结构」、「7 天从算法零基础到精通」能让你快速学会算法知识。

学习算法和数据结构知识,不能靠速成,只能靠不断的积累,一步一步的推敲算法步骤,一遍又一遍的理解算法思想,才能掌握一个又一个的算法知识。而且还要不断的去刷该算法对应专题下的题目,才能将算法知识应用到日常的解题过程中。这样才能算彻底掌握了一个算法或一种解题思路。

根据我过去一年多和小伙伴们一起刷题打卡的经验发现:那些能够坚持每天刷题,并最终学会一整套「基础算法知识」和「基础数据结构知识」的人,总是少数人。

大部分总会因为种种主观和客观原因而放弃了刷题(工作繁忙、学习任务繁重、个人精力有限、时间不足等)。

但不管怎么样,如果你当初选择了学习算法知识,选择了通过刷题来通过面试,以便获取更好的工作岗位。那我希望在达成自己的目标之前,可以一直坚持下去,去「刻意练习」。在刷题的过程中收获知识,通过刷题得到满足感,从而把刷题变成兴趣。

这些话有些鸡汤了,但都是我的心里话。希望大家能够一起坚持刷题,争取早日实现自己的目标。

参考资料

【文章】What is LeetCode? - Quora

【文章】LeetCode 帮助中心 - 力扣(LeetCode)

【回答】刷 leetcode 使用 python 还是 c++? - 知乎

【回答】刷完 LeetCode 是什么水平?能拿到什么水平的 offer? - 知乎

【清单】CodeTop 企业题库