哈喽,大家好,我是Sunny,你也可以叫我萨宁,一个热爱分享编程知识的程序员。我的昵称是Sunny不要停,寓意是美好的晴朗日子不要停下来,希望大家都能每天开开心心的。我的频道主要分享编程知识,生活,大学计算机学科学习,考研经验。目前已经上岸某211计算机专业,有大学学习,考研相关的问题,欢迎关注我,同名公众号[Sunny不要停]可以找到我的wx。
算法刷题,顾名思义就是利用一些方法解决问题,这种问题与高中遇到的数学问题,物理问题类似,不同的是需要计算机的辅助。
所以我们暂且不必畏惧它,它只是数学问题的plus版。在真正去做一件事之前,我们先了解一下它到底有什么用。
算法刷题的妙用
刷题最重要的作用是可以提升人的思维能力,尤其是利用计算机解决问题的思维能力。有了这种思维能力,无论是对项目开发,还是人工智能的理解都会上一个层次。通过计算机解决问题还可以获得成就感,就好像在高中时,你能做出别人做不出的题,那种感觉相信大家有体会。
思维能力也好,成就感也好,这都是比较虚的,那么回归到功利的角度,对于计算机的学生而言,刷题仍然必不可少。
我们以终为始,谈谈我的看法。
首先是就业
计算机的就业大部分是去私企(国企情况不太一样,关于计算机就业方向我们单开一期聊一聊),做的工作不外乎开发岗和算法岗。
这些工作在面试时都需要手撕算法题,一般每次技术面试都会随机抽两道算法题,你需要在面试官面前解题。能否解决算法题很大程度上会影响最终面试的结果,所以从私企就业角度来讲刷题是不可或缺的。
接着是比赛
刷题可以参加很多的比赛,每周在各大平台会有各种周赛,月赛,如果在部分平台的比赛拿到较好的名次,可以直通大厂面试。
其次是各种主办单位办的比赛,例如最有含金量,难度也是最大的 ACM/ICPC
区域赛、总决赛以及CCPC
,但是这些比赛想拿到铜牌及以上难度非常大,需要付出超越常人的努力。此外还有PTA
的天梯赛,蓝桥杯大赛软件组,RAICOM
机器人大赛的编程赛道,CCF-CSP认证
等等。
在这些比赛中拿到比较好的奖项,对于找工作有很大的帮助,其中ACM
系列的比赛拿到铜牌及以上的奖项,在很多大厂(BAT
等等)可以免机试。
还有就是可以加综测分,帮助评奖评优。考研复试时有这些奖项可能会得到更高的分数。
此外在这些比赛中拿到奖项,学校大概率会发奖金,几百几千不等,我见过一个专门打比赛拿奖金的同学,四年累计拿到20万美元。。。
最后是升学
从升学的角度来看,每年考研或者保研,在复试阶段一般都有机试,这个机试就是在规定时间内做几道算法题;有些学校没有机试,但也会以笔试的形式出几道算法题,让同学手写。
我是如何学习算法的?
这里的计算机是一个泛指,说的是计算机大类的学生,包括计算机科学与技术、软件工程、网络安全、大数据科学等等。
所以不难发现,算法刷题似乎成为计算机学生的标配,这也解释了为什么在很多大学ACM集训选拔那么火爆,计算机越好的大学越是如此。
如何开始对很多同学来说是个大问题,选择的方法不对很容易频繁跌跟头,四处碰壁,以至于最后放弃刷题。
我大一刚入学时,在某个晚自习打开刷题网站,选择第一题就开始做,看了半个小时一点思路也没有,然后放弃这道题,做第二道题,结果又是一点思路不会…这个晚上给我做自闭了。后来我才知道我一上来做的就是算法中非常难的专题动态规划。。。
好在在同专业好友的帮助下,我才逐渐重拾信心,摸索出了一条学习算法的道路。
-
学习一门/两门编程语言
C语言和C++,这两门语言其实非常相似,C++是C语言的扩展版。我是先学C++,再学C语言。
你可以思考一下,为什么我先学C++。
我想的是既然C++是C语言的扩展版,那么C++会把原来复杂的操作简化,因为技术的进步一般都会使原来复杂的操作更加方便,那么C++的学习成本一定是更低的。学到什么程度呢?
原则是只学重要的,不要追求一下子学完所有的,很多编程语言的课程动辄几百集,这会很劝退。我一直认为学习是个反复的过程,学完会忘是很正常的事,多用才不会忘。
对于C++和C语言都只需要学完基础语法即可,C++的类及之后的内容刚开始可以不学。学习的时候可以对比对比编程语言之间的异同,你会发现编程语言直接都是相似的,当你学会一门,再学其他的会很快。
在哪学?
大多数的大学计算机老师上课都是念PPT,所以主动学习很重要,学会上哔哩哔哩大学[手动滑稽]。
给大家推荐几个口碑还不错的课程吧。当然如果你觉得看书比看视频更容易学,相关的书籍也非常多,可以在搜索引擎上找找。
-
数据结构是算法的基石
这部分理论性更加重一些,我入门看的是王道的数据结构,这部分除了外部排序,其他的都需要好好理解一下,这对之后的算法学习很重要。
-
开始学习算法&刷题
学习算法有很多途径,如果你参加了学校了ACM集训,那么可能会有学长的讲的课程,此外各大平台(例如力扣,牛客,洛谷)都有自己的算法学习课程。
我学的时候用的是Acwing 算法基础课,这个课程算是我的算法启蒙课,但是不得不说其实学习的难度还是很大的。学这个课程不能操之过急,因为大多数算法我们都没接触过,所以一定要一个专题一个专题啃下来,每一节课所讲的知识点,都要自己再去找相关的习题巩固。
很有可能还是觉得抽象,这时候我会利用好搜索引擎找找有没有讲的比较好的、帮助理解的博客。
哪里可以寻找到练习题?
有非常多的OJ(Online Judge)提供广泛的习题以及在线测评。
在给出这些OJ的地址前,我需要提醒一下,不要一味追求数量,用好两到三个即可。
部分OJ:
- https://www.acwing.com/problem/
- https://leetcode.cn/
- https://ac.nowcoder.com/
- https://pintia.cn/problem-sets/dashboard
- https://www.luogu.com.cn/
- https://acm.hdu.edu.cn/
- http://poj.org/
- http://noi.openjudge.cn/
- http://noi.ac/
关于这些OJ的区别,如果大家想知道,我可以再出一期专门讲讲。
-
多参加比赛
多参加比赛,以赛促练,这是一种很好的提升办法。
我曾经想着要把全部的知识学完再参加比赛,但这种想法是不合适的,等我全学完,黄花菜都凉了。在比赛中可以发现自己的不足,激励自己提高。
每周或者每个月在各个平台上都有免费举办的比赛。
比较出名的有:
- leetcode周赛/双周赛
- 牛客周赛/月赛/挑战赛
- Codeforces比赛(不定期,几天有一场)
- AtCoder比赛
- Acwing周赛
此外还有就是上面我提到的蓝桥杯,天梯赛等等……
最后,行胜于言。算法学习光看不练永远学不会,多学多练,勤能补拙,沉下心来去学习,在路上你就已经超越很多很多人了……
最后的最后把我很喜欢的一句名言送给大家,与君共勉:种一棵树最好的时间是十年前,其次是现在。