Leetcode 刷题初探

10 minute read

题外话

已经有刚好一个月的时间没有写文章了,其实每天都会想着要写些什么,包括 Go 高级技术、《DDIA》的阅读进展,以及一些零散的即兴写作。其实之前写文章有接近日毕的好习惯,这真的是沿袭成长会的优良传统。虽然文章不一定写得好,但只要持续每天写,总有时间去做得更高,而不是一直在等自己状态好,一些补完所有学习/写文章等想法。

还有一点是我参与了成长会的写作日毕小组,借此机(ya)会(li)能够尽可能达到每天写文章的状态。而上个月的今天,也就是小组结束的时候,我也没有让自认为建立起的日毕习惯带动我继续写文章。还是得承认,我是个懒人。

但我也没有闲下来,这一个月的时间,刷了一些 Leetcode 题,一些思考和感悟和大家分享一下,包括为什么想刷题,如何刷题,学习材料,刷题的收获、小组氛围和自己的一些见解等。

开启刷题之路

为什么想刷题

其实很直白的就是为了大厂的面试。每个小程序员心中都有个纯粹地去大厂的梦。但发自内心还是想把算法能力提高,增加对编程语言的理解。然而在今年成长会中,暂时还没有适合自己的技术类小组,既然没有就自己做吧。我也是第一次尝试建立小组,想调动做技术类同学的一个学习氛围。

如何刷题

其实我是调研了许多 github 项目、知乎、简书上的攻略,然后总结了如下一个要点:

(1)短期大量训练。虽然小组是短跑,但想要提高必然要大量练习,不如在这个小组的压力下多 push 一下自己。一天中有时间就去刷一道题。

(2)刷题顺序。由于长期没有刷题的习惯,对算法生疏,对平台的机制不熟悉。先找简单题摸索,多通过些题,既培养刷题感觉、自信,也慢慢培养刷题的好习惯。刷通一遍简单提后,刷中等题。(据了解,大厂出题难度也就中等)

(3)刷题习惯,做难事必有所得。首先脱离一切,去看问题,写代码尝试,直到想不清楚逻辑、彻底忘记了某数据结构,然后先复习数据结构再刷题。还是没通过,找答案通过,然后手抄一遍并标记下来。

(4)学习习惯。每天精读一篇《刷题攻略》/ 刷一集刷题视频 / 一篇公众号博文 / 关注博主随便看看。

学习材料

已经开展了两期刷题小组,学习资料都是源自 github 中 star 很多的项目。

第一期我们用到的是 《LeetCode 刷题攻略》https://github.com/youngyangyang04/leetcode-master ,第一期简单刷了大部分后发现,这个材料还是零零散散。

所以第二期换了学习材料,用的是 《LeetCode Solutions》https://github.com/azl397985856/leetcode ,让我有点意外的是以下几点:

(1)相比上期材料,题目罗列更清晰,更有条理,也更好用来出题。

(2)没想到刷题还有浏览器插件,调研和试用了两个不错的:

	- **Leetcode Editor**,作为 JetBrains 全家桶中的编辑器能够按照插件,可以直接选择题目,并打开题目模板,不用自己再复制。(强烈推荐)

image-20211013234915849

	- **leetcode cheatsheet**,作者给出的插件,提供了一些解题的模板,可惜只有 js 和 py 版本。(一些树、图、动态规划等题目可以先用起来)

image-20211013235042442

(3)一直想了解一下 Anki,都没一个感兴趣的主题,没想到 Leetcode 也有,而且意外发现非常适合。

刷题收获

(1)刷题量,两道简单一道中等还行,但多一道中等就有点难受了。

(2)粗略复习了八种数据结构(数组、链表、哈希表、字符串、栈与队列、树、回溯、排序)和两种编程语言的常用基础语法(Python 和 Go 都用到了)。总结了:链表、哈希表、回溯、树类型题目中的关键步骤。

(3)尝试用不同编程语言实现算法,增加了对算法思想的印象、加深了对编程语言的熟悉度。 (4)掌握了一天当中刷题的节奏:

​ 1)完成任意一道题。星星之火可以燎原。

​ 2)查漏补缺学习知识点,进行一道专项训练。东方不亮西方亮。

​ 3)重新做一遍通过但需要再回顾的题,可以是重新做,可以是用其他语言来实现。温故而知新。

小组氛围

第一期

我们小组宣传做得不到位导致成员较少(最终也只有3个人)。公文不够吸引,其他渠道也没有做进一步推广和预热。需要对比其他小组情况。

小组氛围算不上活跃,除了作业沟通,其他沟通较少。因为人少没有同步开通微信群。需要再和同学们进一步沟通。

小组每天会出题,作业量都是根据前一天自己超额的完成量来定的,但自己能力还是有许多不足、有许多没有考虑到的地方,还处于打铁没样,边打边像的模仿阶段。还需要再多借鉴其他小组的运营。

第二期

工作上有点事,导致二期小组开展地慢了点。而且也没及时在星球或其他渠道推广。即便如此,我也没有一丝慌张,担心小组没有人再参与。但凭借自己重新编排的二期公文、自己的行动量以及自己的学习能力,相信我们小组会越做越好,只要持续行动就能吸引更多伙伴。

作业不再是主要交流,虽然我们的结营直播会顾及每个同学的感受,但这期开通了微信群,我们平时“闲扯”都在其中。

这一期的特色就如同新的学习材料中的描述,我将我们小组称为“Leetcode 技术小组”,原因不在于多么高大上,而是我们会去探索技术,比如 github 加速访问的代理、浏览器插件、版本控制工具 git、以及记忆卡片 anki 等。

一些认知

  1. 解算法题没有固定用到的数据结构,但有更简洁代码解和更优性能解。
  2. 如果用了超过半个多小时没有思路,一个小时没做出来,可以去看看题解。
  3. 不用太纠结自己看了答案就像这道题自己白做了,重要的是参与题目的思考,梳理问题、尝试用各种方法来“破解”,就像做解密游戏一样。
  4. Leetcode 是挺有难度的,即便是计算机专业出身,做这个也有点吃力,是正常的。不过能坚持下去了,收获肯定不小。