刷了 1000 多道算法题,一点心得

1,890 阅读11分钟

大家好,我是鱼皮,今天分享一下自己刷算法题目的经验。

程序员为啥要刷算法?

因为 “卷啊”!

开个玩笑,其实,算法题目已经成为了公司筛人的一种方式,大厂的每一轮面试基本都会有几道算法题,甚至有的公司笔试全部都是算法题。其他题目答的都差不多,那你算法题做不出来,可能就被淘汰了。

所以为啥要刷算法题呢?一方面是帮助你学习和理解算法,但另一方面也是像背公式、背八股文一样,增加你面试时碰到原题的概率。我刷了 1000 多道题嘛,不夸张的说,在面试的时候 80% 的算法题都是原题。

当然,每个人学算法、刷题的目标是不同的,首先 要明确你的目标,因为目标不同,刷算法的平台和方法也不同。

常见的目标有以下四种:

  • 学习基本编程语法和思想
  • 想找大厂工作,应对面试
  • 算法竞赛
  • 锻炼自己的思维

大部分同学的目标应该都是第二个。现在的程序员面试中,算法题目基本是必问的,所以,为了找到一份不错的工作,越来越多的同学意识到了刷算法的重要性,甚至有一些同学刚开始学编程,编程语言用的还不熟悉,就想着要提前刷算法准备起来了。

先聊聊编程新手应该怎么刷题吧?

编程新手刷题

对于大一同学,大部分都是刚开始接触编程,所以刷题的目标应该更倾向于第一种,即帮助自己学习编程。

LeetCode 确实是如今最火爆的算法刷题平台,但有一个很大的误区就是一上来就刷 LeetCode,对于编程小白来说,基础的编程语法、函数、面向对象都还不会呢,刷什么 LeetCode?学什么数据结构和算法!?

如果基本的编程语法还不熟悉,我建议老老实实地做一些 基础练习题,应该大部分学校的老师都会布置课堂作业吧?

比如我大一的时候基本就是在刷老师留的 OJ(Online Judge 在线判题平台)作业题目,不同于清华北大等一系列名校的 OJ,我们当时刷的题都比较简单,每道题目都是解决一个小问题,比如用 C++ 的 new class 来造汽车。目的是帮助同学们学习 C 语言、C++、Java 等基础语法,熟悉面向对象编程思想,所以比较容易上手。

可能有同学觉得作业比较难对吧,其实学校布置的课堂作业大部分都很基础很基础,如果这都觉得难,我认为比起尝试网上的专业算法刷题平台,倒不如踏踏实实先把简单的作业题啃透和理解。

这里我推荐 PTA 程序设计类实验辅助教学平台,上面提供了不少适合新手入门的简单练习题,比如基础编程题目集、浙大版《C语言程序设计(第3版)》题目集等。

网址:pintia.cn/

如果你已经能够使用一门编程语言开发简单的程序了,那就要 确定自己的下一个目标,为了通过面试刷算法?还是想挑战自我,参加竞赛呢?

下面我针对不同的目标,来分别推荐一些资源。

找工作刷题

现在大厂面试基本每一轮都会考几道算法题目,因此,越来越多的小伙伴意识到刷题的重要性。

其实,不需要关心太多平台,找工作刷题,选择 LeetCode 就够了,国内最全的算法刷题网站。

地址:leetcode-cn.com/

很多朋友刚开始刷 LeetCode 可能都会怀疑自己的智商,比如我。

我是一名计算机专业的学生,并且大一时还做过一些 ACM 题目,水到过一些小的比赛奖项,但是初次接触 Leetcode 时感觉仍然像是走进了一个船新的世界,感觉上面的题目自己无从下手。

后来和别人交流才发现,原来我不是一个人,一头雾水才是刚开始刷 Leetcode 的正常情况!

不过当我找到了诀窍后,渐渐发现 Leetcode 也没有那么恐怖。我是从大二开始刷算法的,每天坚持留 2 个小时,刷 2-3 道题目,大概过了一年,面试中的算法题目基本都可以迎刃而解!也帮助我拿到了一些大厂的 offer,最后入职鹅厂。

我总共刷了 1000 多道算法题目,光在 Leetcode 上就有 600 多道(简单、中等各占一半),还刷了一些其他平台或书籍上应对面试的题目,比如《剑指 offer》、牛客、PAT 等,也都不错。

我刷的 Leetcode 题目

刷了这么多道题目后,明显感觉自己的思维能力有了很大的提升,感觉 Leetcode 好像也没那么难了。

回想最初被 Leetcode 搞到怀疑人生,还是自己没有找对方法吧~

所以下面简单地分享下自己刷 LeetCode 的小技巧,希望大家少走弯路。

1. 刷题顺序

记住三个要点:从【学习板块 LeetBook】刷起,从【简单的】刷起,从【通过率高】的刷起!

LeetBook 是 LeetCode 精心整理的算法和数据结构专项练习(以前叫探索,爷青结),每个专项对应一个重要的知识点,并通过一系列相关的题目带大家入门,相对自己零散地选题目来说,更加简单实用,还附有讲解,是入门的不二之选。

像面试无非就那么几个重点:树、动态规划、深度 / 广度优先搜索、链表、数组、排序、栈、队列、哈希、字符串等。你要先完成专项练习中一些简单的题目,理解其背后的算法和数据结构。之后,再举一反三,练习更多相关的题目,当你能做到用同一个算法解决一类共性问题,做到 多题一解 时,才算是真正理解了。

LeetBook 专项学习

地址:leetcode-cn.com/leetbook/

刷完 Leetbook 专栏后,进入题库,利用 LeetCode 自带的题目筛选和排序功能,能够帮助我们由简单到中等再到困难,渐进式刷题。一般来说,先刷通过率较高的题目,相对比较容易。

2. 利用题解

LeetCode 的每道题目都有很多小伙伴给出了题解,讲述如何解决这道题。

怎么才算利用题解呢?

首先,读题解包括两个部分,读思路读代码,既要理解作者做题的思路和逻辑,也要细致入微地学习他人代码中优秀的写法。即使这道题目你做出来了,击败 100% 了,我也建议去看看别人的题解,学习更多他人解题的思路,帮助自己打开脑洞,做到 一题多解

除了 LeetCode 自带的题解之外,网上有很多其他大佬整理的算法题解,各种编程语言的都有!

比如全网疯传的谷歌大佬算法刷题笔记(C++ 语言):

还有 Go 语言的算法题解:

还有《数据结构 Java 语言描述》:

以上资源都整理到我开发的【编程导航】中了,可在线免费阅读!

地址:www.code-nav.cn

话说,现在网上的题解实在是太多啦!在刷题时,读个一两份就行了,别给自己太大压力。

除了看题解外,很多同学没有意识到,多写题解 才是真正的法宝,把自己的解题思路整理成文,或者讲给别人听。这样做不仅能够加深自己对题目的印象,进一步加深对算法的理解,帮助自己回顾解题过程,从而在面试的时候更容易复述;还能帮助到更多同学。

甚至有一些厉害的同学通过记录和分享自己的题解,还没毕业,就已经出版了自己的书籍,年入几十万或者百万!

哎嘿,我才发现自己当年写的一些题解阅读量也破千了,爷青回啊!

3. 精益求精

当你每次成功解题时,LeetCode 系统会生成一份解题报告,告诉你的程序在时间和空间上击败了多少用户。

虽然答出题目就已经很棒了,但还不够。面试的时候,一些面试官就喜欢给你出题目的变种,或者要求你用更优的方式解出题目。所以,在保证完全理解题目解法的基础上,请不断优化你的代码,找到更多的思路和更优解,直到击败 100% 的用户吧。

我们在工作中,虽然未必会直接和算法打交道,但学习算法对工作的帮助真的很大!

解算法题时,我们要对多种算法分析复杂度,从中选择最优解。而在工作中,也是如此,一个需求有很多种实现方式,经常也要设计几种不同的方案,分析他们的成本、性能等差异,选择其中最好的一种进行实施。

所以,请认真对待每一道算法题目,把它当成一个工程问题来解决,相信你的思维会逐渐打开,并逐渐掌握编写高性能程序的技巧。

4. 参与竞赛

我建议大家多参加算法竞赛,这里的竞赛不是指 ACM 区域赛那种大神级别的,别忘了此时我们的目标只是找工作。

其实,LeetCode、牛客等网站每周都会开展一次线上算法竞赛,看看谁能在有限时间内最快最多地解题。

在竞赛的过程中,紧张刺激的环境会使我们的精神保持高度集中,能够激发出我们的思维,从而在有限的时间内进行更多的思考,也能帮助我们适应面试的节奏。多多参加还有机会获得他们官方提供的奖励!虽然我这小菜鸡一次也没拿到 555。

此外,参加蓝桥杯竞赛也是不错的,我自己也参加了两届,题目的难度和找工作要求的算法题目难度相当,也能发现自身的不足、激励自己进步吧。

5. 考取证书

这几年,PAT 计算机程序设计能力考试在逐渐升温,分为顶级、甲级、乙级三个级别。

我亲身参与过甲级和乙级的考试,难度适中,虽然目前这个证书的含金量不高,但在备战考证的过程中,你有一个学习的目标,会更有动力坚持下去。在我看来,过程大于结果。

网址:www.patest.cn/

6. 看文章

其实很多零碎的时间,大家也可以利用起来,看一些推送、文章之类的,比如我大二暑假坐高铁实习的路上就是看小灰的漫画来学算法,5 - 10 分钟一篇,这个时间不保证你能学会,但看了之后最少能让你对算法有个基础的印象。时间就像我脑袋里的水,挤一挤还是有的,想超过那些比你有天赋的人,就一定要利用好时间。

算法竞赛刷题

再聊聊目标成为算法竞赛大神的同学应该怎么刷题吧,不过这个话题,我确实不够专业。

老实讲,我只在大一大二的时候参与过几场 ACM 算法竞赛,虽然没有拿到很好的成绩,但还是可以很负责任的告诉大家,算法竞赛的难度和需要的训练强度可不是一般的同学能承受的!想要拿到不错的竞赛成绩,至少要在以下任意一个 OJ 平台刷个几百题,而且确实也需要一定天赋(数学、逻辑、英语等),不然会更累。

直接在编程导航搜索 OJ 可以直接看到所有的 OJ 平台,比如北京大学 POJ、浙江大学 ZOJ 等,都非常不错!

地址:www.code-nav.cn/resources/a…


至于什么时候可以停止刷题了呢?这也要看你刷题的目的,是找工作还是持续锻炼思维提升自己?

我身边一些同事还保留着刷算法的习惯,但我找到工作后,对算法的态度就像是仇人了,不想见,能不见就不见。

无论如何,刷题一定要拉长战线、养成习惯,每天最好固定一个时间,坚持做几道题目,比如我当时是每天早上还在床上躺着时,掏出手机看一道题目,然后闭着眼睛思考一会,想到解法后再起床敲。

千万不要急于求成、爆发式刷题!而且除非你对算法很有自信,否则我建议找到工作前不要停止刷题。

最后,万事开头难,希望大家不要怀疑自己的能力,更不要怀疑自己的智商。算法和编程语言学习一样,找对方法,付出努力,一定会有进步的!