今天分享一下自己刷算法题目的经验。
首先,要明确你的目标,因为目标不同,刷算法的平台和方法也不同。
常见的目标有以下四种:
学习基本编程语法和思想
想找大厂工作,应对面试
算法竞赛
锻炼自己的思维
大部分同学的目标应该都是第二个。现在的程序员面试中,算法题目基本是必问的,所以,为了找到一份不错的工作,越来越多的同学意识到了刷算法的重要性,甚至有一些同学刚开始学编程,编程语言用的还不熟悉,就想着要提前刷算法准备起来了。
先聊聊编程新手应该怎么刷题吧?
对于大一同学,大部分都是刚开始接触编程,所以刷题的目标应该更倾向于第一种,即帮助自己学习编程。
LeetCode 确实是如今最火爆的算法刷题平台,但有一个很大的误区就是一上来就刷 LeetCode,对于编程小白来说,基础的编程语法、函数、面向对象都还不会呢,刷什么 LeetCode?学什么数据结构和算法!?
如果基本的编程语法还不熟悉,我建议老老实实地做一些 基础练习题,应该大部分学校的老师都会布置课堂作业吧?
比如我大一的时候基本就是在刷老师留的 OJ(Online Judge 在线判题平台)作业题目,不同于清华北大等一系列名校的 OJ,我们当时刷的题都比较简单,每道题目都是解决一个小问题,比如用 C++ 的 new class 来造汽车。目的是帮助同学们学习 C 语言、C++、Java 等基础语法,熟悉面向对象编程思想,所以比较容易上手。
可能有同学觉得作业比较难对吧,其实学校布置的课堂作业大部分都很基础很基础,如果这都觉得难,我认为比起尝试网上的专业算法刷题平台,倒不如踏踏实实先把简单的作业题啃透和理解。
这里我推荐 PTA 程序设计类实验辅助教学平台,上面提供了不少适合新手入门的简单练习题,比如基础编程题目集、浙大版《C语言程序设计(第3版)》题目集等。
网址:https://pintia.cn/
如果你已经能够使用一门编程语言开发简单的程序了,那就要 确定自己的下一个目标,为了通过面试刷算法?还是想挑战自我,参加竞赛呢?
下面我针对不同的目标,来分别推荐一些资源。
现在大厂面试基本每一轮都会考几道算法题目,因此,越来越多的小伙伴意识到刷题的重要性。
其实,不需要关心太多平台,找工作刷题,选择 LeetCode 就够了,国内最全的算法刷题网站。
地址:https://leetcode-cn.com/
很多朋友刚开始刷 LeetCode 可能都会怀疑自己的智商,比如我。
我是一名计算机专业的学生,并且大一时还做过一些 ACM 题目,水到过一些小的比赛奖项,但是初次接触 Leetcode 时感觉仍然像是走进了一个船新的世界,感觉上面的题目自己无从下手。
后来和别人交流才发现,原来我不是一个人,一头雾水才是刚开始刷 Leetcode 的正常情况!
不过当我找到了诀窍后,渐渐发现 Leetcode 也没有那么恐怖。我是从大二开始刷算法的,每天坚持留 2 个小时,刷 2-3 道题目,大概过了一年,面试中的算法题目基本都可以迎刃而解!也帮助我拿到了一些大厂的 offer,最后入职鹅厂。
我总共刷了 1000 多道算法题目,光在 Leetcode 上就有 600 多道(简单、中等各占一半),还刷了一些其他平台或书籍上应对面试的题目,比如《剑指 offer》、牛客、PAT 等,也都不错。
我刷的 Leetcode 题目刷了这么多道题目后,明显感觉自己的思维能力有了很大的提升,感觉 Leetcode 好像也没那么难了。
回想最初被 Leetcode 搞到怀疑人生,还是自己没有找对方法吧~
所以下面简单地分享下自己刷 LeetCode 的小技巧,希望大家少走弯路。
记住三个要点:从【学习板块 LeetBook】刷起,从【简单的】刷起,从【通过率高】的刷起!
LeetBook 是 LeetCode 精心整理的算法和数据结构专项练习(以前叫探索,爷青结),每个专项对应一个重要的知识点,并通过一系列相关的题目带大家入门,相对自己零散地选题目来说,更加简单实用,还附有讲解,是入门的不二之选。
像面试无非就那么几个重点:树、动态规划、深度 / 广度优先搜索、链表、数组、排序、栈、队列、哈希、字符串等。你要先完成专项练习中一些简单的题目,理解其背后的算法和数据结构。之后,再举一反三,练习更多相关的题目,当你能做到用同一个算法解决一类共性问题,做到 多题一解 时,才算是真正理解了。
LeetBook 专项学习地址:https://leetcode-cn.com/leetbook/
刷完 Leetbook 专栏后,进入题库,利用 LeetCode 自带的题目筛选和排序功能,能够帮助我们由简单到中等再到困难,渐进式刷题。一般来说,先刷通过率较高的题目,相对比较容易。
LeetCode 的每道题目都有很多小伙伴给出了题解,讲述如何解决这道题。
怎么才算利用题解呢?
首先,读题解包括两个部分,读思路 和 读代码,既要理解作者做题的思路和逻辑,也要细致入微地学习他人代码中优秀的写法。即使这道题目你做出来了,击败 100% 了,我也建议去看看别人的题解,学习更多他人解题的思路,帮助自己打开脑洞,做到 一题多解。
除了 LeetCode 自带的题解之外,网上有很多其他大佬整理的算法题解,各种编程语言的都有!
比如全网疯传的谷歌大佬算法刷题笔记(C++ 语言):
还有 Go 语言的算法题解:
还有《数据结构 Java 语言描述》:
以上资源都整理到我开发的【编程导航】中了,可在线免费阅读!
话说,现在网上的题解实在是太多啦!在刷题时,读个一两份就行了,别给自己太大压力。
除了看题解外,很多同学没有意识到,多写题解 才是真正的法宝,把自己的解题思路整理成文,或者讲给别人听。这样做不仅能够加深自己对题目的印象,进一步加深对算法的理解,帮助自己回顾解题过程,从而在面试的时候更容易复述;还能帮助到更多同学。
甚至有一些厉害的同学通过记录和分享自己的题解,还没毕业,就已经出版了自己的书籍,年入几十万或者百万!
哎嘿,我才发现自己当年写的一些题解阅读量也破千了,爷青回啊!
当你每次成功解题时,LeetCode 系统会生成一份解题报告,告诉你的程序在时间和空间上击败了多少用户。
虽然答出题目就已经很棒了,但还不够。面试的时候,一些面试官就喜欢给你出题目的变种,或者要求你用更优的方式解出题目。所以,在保证完全理解题目解法的基础上,请不断优化你的代码,找到更多的思路和更优解,直到击败 100% 的用户吧。
我们在工作中,虽然未必会直接和算法打交道,但学习算法对工作的帮助真的很大!
解算法题时,我们要对多种算法分析复杂度,从中选择最优解。而在工作中,也是如此,一个需求有很多种实现方式,经常也要设计几种不同的方案,分析他们的成本、性能等差异,选择其中最好的一种进行实施。
所以,请认真对待每一道算法题目,把它当成一个工程问题来解决,相信你的思维会逐渐打开,并逐渐掌握编写高性能程序的技巧。
我建议大家多参加算法竞赛,这里的竞赛不是指 ACM 区域赛那种大神级别的,别忘了此时我们的目标只是找工作。
其实,LeetCode、牛客等网站每周都会开展一次线上算法竞赛,看看谁能在有限时间内最快最多地解题。
在竞赛的过程中,紧张刺激的环境会使我们的精神保持高度集中,能够激发出我们的思维,从而在有限的时间内进行更多的思考,也能帮助我们适应面试的节奏。多多参加还有机会获得他们官方提供的奖励!虽然我这小菜鸡一次也没拿到 555。
此外,参加蓝桥杯竞赛也是不错的,我自己也参加了两届,题目的难度和找工作要求的算法题目难度相当,也能发现自身的不足、激励自己进步吧。
这几年,PAT 计算机程序设计能力考试在逐渐升温,分为顶级、甲级、乙级三个级别。
我亲身参与过甲级和乙级的考试,难度适中,虽然目前这个证书的含金量不高,但在备战考证的过程中,你有一个学习的目标,会更有动力坚持下去。在我看来,过程大于结果。
网址:https://www.patest.cn/
再聊聊目标成为算法竞赛大神的同学应该怎么刷题吧,不过这个话题,我确实不够专业。
老实讲,我只在大一大二的时候参与过几场 ACM 算法竞赛,虽然没有拿到很好的成绩,但还是可以很负责任的告诉大家,算法竞赛的难度和需要的训练强度可不是一般的同学能承受的!想要拿到不错的竞赛成绩,至少要在以下任意一个 OJ 平台刷个几百题,而且确实也需要一定天赋(数学、逻辑、英语等),不然会更累。
直接在 编程导航 搜索 OJ 可以直接看到所有的 OJ 平台,比如北京大学 POJ、浙江大学 ZOJ 等,都非常不错!
地址:https://www.code-nav.cn/resources/algorithm?q=oj
至于什么时候可以停止刷题了呢?这也要看你刷题的目的,是找工作还是持续锻炼思维提升自己?
无论如何,刷题一定要养成习惯,像高考做卷子一样,每天最好固定一个黄金时间,坚持做几道题目,而不是急于求成、爆发式刷题!
最后,万事开头难,希望大家不要怀疑自己的能力,更不要怀疑自己的智商。算法和编程语言学习一样,找对方法,付出努力,一定会有进步的!