KaaPexei 发表于 2021-8-4 14:57

大一计科生,可以用哪些方法提高自己的算法水平?

现在大一下,老师在讲数据结构,有时会涉及算法。我觉得有些算法很难懂,但是懂了之后就会觉得很有趣,感觉计算机思维真的有改变我对世界多思考方式啊。

rustum 发表于 2021-8-4 15:05

真的同学,字节跳动的猪学长看到了你说:
我觉得有些算法很难懂,但是懂了之后就会觉得很有趣,感觉计算机思维真的有改变我对世界多思考方式啊。猪学长感到心里一暖,想起了当年的自己。
我大一的时候就是那个天天抱着笔记本电脑沉浸在各种算法题目的孩子,
当别人都觉得这些题目很枯燥,很难,很无聊的时候,猪学长自己却为各种数据结构精美的设计与各种算法巧妙的优化上深深的痴迷。
看到你大一的时候能跟我一样,并不因为算法刚学习的困难,难懂所退却,反而能够感受到算法的趣味与魅力,猪学长心里真的是非常开心。
自从来知乎回答问题之后,每有很多学计算机的同学跑过来问猪学长:想要学习编程入门应该从哪里开始呀?我应该从哪里开始呀?
而你大一就已经知道算法与数据结构的重要性:
想问问有什么途径或者方法可以多了解一点算法,为之后的学习奠定基础。而且还知道到知乎上向前辈们提问,猪学长今天一定用心给你写写回答,希望你看到我的回答之后,能在大学里成为一名具有扎实算法与数据结构功底的优秀的计算机专业的同学。
一、想要学好编程,算法与数据结构真的很重要。

1、说根本:猪学长作为一个工作了很久的程序猪,真的想对每一个以后想从事编程相关工作的大学生说:真的,好好利用好大学时光,在大一大二早早打下扎实的算法与数据结构基础,锻炼出自己强大的程序设计能力,是一件可以受益很久的事情。
2、说大学:如果你大学里想要超过很多同龄人,在成绩比赛等加分方面超过别人,大学计算机专业里有非常多程序设计类比赛都是非常有含金量的。如果你能在大一就多刷一些题目,打下坚实的编程基础,绝对可以让你在大二大三在各种别赛中崭露头角,最后大学里各种评奖评优奖学金都不是梦。
3、说深造:如果你有意向大学毕业进入高等学府继续深造,那么无论你是保研还是考研。现在国内著名的计算机高等院校复试均有上机在线编程考试。无论你大学里成绩多优异,无论你考研初试多高,研究生复试机考永远是你不可避免的一关。大学里热爱算法,热爱编程刷题很多的同学们,往往都会在机考中取得优异的成绩,甚至可以弥补你初试分数低的不足。学长还见过大学里非常优秀的其他同学,就是因为只注重考试的分数,疏忽了对自己编程能力的训练,最后导致复试机考爆冷,与自己心仪的大学失之交臂的。
4、说工作:随着国内互联网行业的发展,对编程人员求职者编程能力的考察越来越重视。如果你以后希望去外企工作,你会发现外企非常注重对求职者算法与数据结构基础,编程能力的考察。国内互联网早些年可能不会要求职者面试时编写程序,现在几乎各大公司面试都会模仿外企的模式,考察求职者的编程能力。很多面试题背很多,很多开发框架了解多少,面试造的火箭对你以后做的工作不一定影响很大,但是你的编程功底是否扎实直接影响了你以后的工作效率。如果你没有通过编程题目的考察,几乎很难通过心仪公司的面试。
5、说关键:除非你是天才,否则大多数普通人很难短时间提高自己的编程能力的。有很多人临时抱佛脚,到复试机考,到快面试的时候才想起来刷题。除了少数人运气好的碰巧遇到了原题之外,剩下绝大所述人临时抱佛脚几乎都是不起作用的。作为一个走过大学的科班学生,就是到了大三很多成绩优异的同学连递归,二分都写不明白的同学大有人在,真的计算机不是一个文科专业,很多人把计算机都学成了文科,背各种各样的面试题。其实远不知打好编程基础才是大学里非常重要的。
上面这些关于算法重要性的总结,来自猪学长去年工作之余随手给同学们写过的回答,到目前已经收获了同学们1500+的赞同:
大一学习C/C++时是否需要大量刷题?可以先去看一下这个回答。但是好多同学看完这个回答。跑过来问猪学长很多更细节的问题:
c语言学到什么程度才可以刷题呀?c语言c++到底需要学哪些呀?刷题一开始不会做怎么办呀?
如果你是刚接触C语言的小白同学,这里先推荐给同学们一个完全免费的c语言入门课程,可以帮助小白同学快速上手!!!
知乎营销平台虽然猪学长上个月补充了第二版的回答,但是感觉对于很多小白同学来说还是不够细致,今天猪学长在这里会写更详细的第三版。
<hr/>二、大一小白同学刷算法题用什么语言比较推荐呢?

猪学长是一直推荐刚入门编程的同学做算法题目使用c++的。如果你对大学里各种程序设计竞赛有了解的话,你就会发现对于做算法题目来说c/c++真的是使用率非常高的语言。因为c/c++非常接近底层,对于单纯的做算法题而言,几乎用不到面向对象的特性,所以c/c++对于写面向过程较多的算法题而言非常的简洁舒服,并且运行速度快。入门编程的同学在用c/c++练习题目的过程中,也会对计算机底层的很多知识有更深的了解。c/c++如果打下了坚实的基础,以后学习其他语言真的轻而易举的。
这里有很多要参加校招的同学过来问猪学长,
如果我校招投递的岗位并不是c++,比如前端java这写,那我面试的时候可以用c++写题目吗?
答案是可以的,校招技术岗位笔试或者面试过程中的编程环节都是可以选择自己熟悉的语言的。
猪学长只是建议同学们用c++来刷算法题,如果有对ACM等很多算法竞赛有了解的同学,就会知道c++是很多算法竞赛选手最常用的语言,同时很多算法书籍的题解也都是用c++语言的。
三、写给零语言、零编程基础同学的干货算法学习提高路线

a、小白入门算法编程先要正确的学习c/c++语言
如果你不喜欢看书来学习的话,这里先推荐给同学们一个完全免费的c语言入门课程,可以帮助小白同学快速上手!!!
知乎营销平台关于c/c++语言这块简直有太多小白同学来问我了,有无数的大一的同学看了知乎上很多其他已经工作多年的前辈推荐学习c++需要看《c++ primer》,然后刚接触编程就去买了一大厚本厚厚的《c++ primer》,然后买回来根本看不懂。
在这里猪学长跟所有刚接触编程的同学说一下哈,简单学习一下c++这门语言入手用来做算法题目,不需要去看《c++ primer》这本书的!这本书是对需要校招想要求职c++相关岗位才需要学习的。
刚刚接触编程与算法的小白同学只需要学习c语言的基本语法,与c++的STL标准库容器相关的知识就可以啦。猪学长在这里贴心的详细的为大家把需要重点了解的内容给标记出来:
上面这本书是我任意找的一本c语言教程书籍,小白同学们学习c语言只需要重点学习:
输入与输出
类型、运算符、表达式
控制与循环
函数
指针与数组
结构体
这几个章节就可以啦,其中额外说明一下指针如果觉得难的同学可以不用先搞太懂,算法竞赛刷题用到的指针也只是简单层面上的使用。
上面这些书籍猪学长之前一直有整理,如今都免费分享给同学们:


点这里, 计算机优质书籍项目免费推荐分享!然后c++的学习,猪学长之前推荐过这本书:


大家不用一定要用一模一样的我推荐的书籍来学习,其实用于算法竞赛刷题,c++这块只需要学习补充很少的知识,额外很多c++的特性其实是用不到的。下面我也详细的告诉大家需要学哪里:
首先大家可以看到,c++书籍中很大一部分的基础知识其实就是c语言的知识,如果同学之前c语言都学习过了,接触上手c++其实是很快的。c++相对于c语言最主要的就是扩充了一系列的面向对象的机制,但是类这些面向对象的机制我们在算法竞赛中其实是用不到的。那c++我们重点需要学习哪些呢?
上面这些书籍猪学长之前一直有整理,如今都免费分享给同学们:


点这里, 计算机优质书籍项目免费推荐分享!我们只需要重点了解标准容器中这些概念知识就足够啦!
其他尤其关于类的各种抽象、封装、继承等面向对象机制与其他的知识,暂时先简单阅读了解就行,如果不是能够很好的掌握也没关系。
关于算法相关的部分知识,也就是简单的阅读,大致的理解这些都是什么,如何使用就可以了。如果对其中很多概念还是不理解,可以翻翻书其他部分或者Google搜索一些博客补充一些知识。
尤其是同学们千万不要上来就死记硬背c语言c++编程书籍,看过了的语法忘了是很正常的,后面大家做算法题目练习编程的时候,忘记了某些语法是可以随时翻书的。
猪学长之前本科打算法竞赛的时候,学习的时候,有收藏使用一个汇总了所有c/c++ STL等关键模板库以及常用语言知识点的电子版手册,可以说是真的非常的好用。
其中最关键的就是有c++ STL 标准模板库的详细整理总结!!!这个对正在刷算法题的同学们,帮助真的是非常的关键。这里直接现在免费分享给同学们!!!
c/c++ STL中文参考手册电子版免费分享



B、想要提高算法与编程能力真的不能只看书,一定要动手!动手!动手!
我看知乎上有太多太多的同学提问,啊啊啊编程语言看了记不住改肿么办?啊啊啊算法与数据结构课程好难,看了半天书也不知道讲的是什么?
真的同学们,真的学习计算机编程,只看书不写程序都是耍流氓!
猪学长当初入门编程,完全是从接触了大量的编程题目开始的,以完美的解决编程题目的为导向,然后反过来推动自己进一步看更多的书籍。
解决问题的过程中,不仅可以激发起自己的兴趣,还能一步一步来提高自己的编程算法能力。
我看到有的回答,上来就直接给推荐《算法导论》,LeetCode....
我真不知道他们是在帮助大家,还是来劝退同学们别学了.....
猪学长在这里真的再次推荐所有大一大二刚入门编程的同学,大家在对c++语言有了基础简单了解以后,不要在反复死记硬白再看编程语言书籍啦,就可以尝试来做PAT (Basic Level) Practice (中文)的题目啦!
PTA | 程序设计类实验辅助教学平台乙级题目具体的位置在下面这里:
猪学长之所以推荐这个,是因为之前我之前一直活跃过非常多的oj平台,一直觉得PAT (Basic Level) Practice (中文)乙级的题目是最适合编程小白入门的题目合集了。
乙级的题目每个题都是一个有趣的小例子,然后只涉及数组,循环,判断,字符串等基础编程语言语法的知识,不会设计复杂的算法与数据结构。
同时同学们要记住刷题的目的是为了提高自己的编程能力,不是为了数量。
乙级的题目大概做30-50题目,对c/c++的基础语法掌握的非常扎实了。
你就会发现你初步的了解什么是编程,什么是算法。
你还会知道原来编程可以解决这么多的问题呀!
当然在做题目的过程中,如果语法忘记了就可以随时翻书。
有的题目为什么差一个点没有通过,都需要你去排查bug,
这个过程既是对语言语法的熟悉,也是对程序设计能力的高。
遇到不会的问题,可以去网上搜对应的题解参考,
pat题目的题解网上比如csdn之类的是全部都可以找到的。
尤其是当看到其他人写的优秀的题解代码的时候,
真的会由衷的觉得,怎么能写的这么简洁精美!
这个过程中,你的编码能力就在提高。


当然学长之前学习的时候也有找到pat题解的优质pdf文档,
这里直接免费分享给同学们。提取码是:uat0


c、算法编程进阶,开始接触数据结构与更多算法

猪学长之前看到了一个问题,特别有意思:这个问题我还没来得及去回答。
大一数据结构上课听不懂,看书全是伪代码不会,数据结构到底是个什么样的东西?这个同学的提问很明显暴露出了我国计算机教育的问题,就是按部就班的推进课程,其实学生能力根本没得到训练与提高。
算法与数据结构是猪学长本科时候觉得最有意思的课程,这门课程我们是大二才开,但是我大一的时候自己提前学了好几遍了。印象很深刻这门课我一学期没怎么去上课,最后期末拿了99分的成绩。哈哈,不给我100老师说是怕我骄傲。
那猪学长是怎么把数据结构学的这么好的呢?
还是前面的方法论,要以解决问题为导向,反过来看书!!!
而不是先去啃厚厚的困难的算法书籍,然后看的一头雾水。
当你已经能完全可以胜任pat Basic Level的题目后,
你就可以在学校课程之前,提前去学习了解数据结构的相关内容:
这里推荐: 《啊哈!算法》这本书来入门
这本书真的是用非常幽默易懂的语言,
以及各种有趣具体的例子,来帮助很多同学入门算法与数据结构!!!
这本书跟之前一样,先简单的翻阅,
初步的了解什么是线性结构,链表,栈?
什么是非线性结构,树,二叉树?
什么是图?哇,计算机程序中咋还有图?
通过这些,你就会发现你对算法与数据结构有了初步的了解!
这时候,你会发现你的编程有多了很多技能,这时候你就可以去挑战更高难度的题目了!
叮!Pat Advanced Level 解锁!
你就可以去做PAT advanced 甲级的题目了,
真的pat甲级题目所设计到的数据结构难易程度真的是非常棒的。
没4个题目为一组,
前两题是乙级题目,后两题是甲级数据结构的题目。
会涉及到主流的链表,栈,树,以及基本图论算法的知识,
最关键的是不会出现很多ACM困难级别的算法题目!
真的建议所有有时间的同学,好好的做一下PAT甲级的题目,这个质量真的是高。
题解同样去网上搜索,或者用猪学长整理的也行。
当然学长之前学习的时候也有找到pat题解的优质pdf文档,
点这里直接免费分享给同学们。 提取码是:uat0
当你Pat甲级做了50道左右,比较熟练了的时候。
叮!剑指offer习题集解锁!
剑指Offer_在线编程+题解_牛客题霸_牛客网这个还有配套书籍:
上面这些书籍有需要的同学学长也分享给你:
计算机优质书籍项目免费推荐分享!
这时候,你的算法编程能力来到了提高的关键期,
这时候你会遇到非常多更难一些的题目。
比如你看到这个题目: 二叉树的深度
你看到了题目丝毫不会做,这时候你就去找大佬的题解,发现题解写的完全看不懂,
然后你就想起来了这个题用到了二叉树这种数据结构,
然后自己回头再去翻数据结构教材或者书籍,重新结合这个题目再去学习二叉树的基本知识,
比如二叉树的遍历等等。
等你复习好,这回回来再看大佬的题解,发现明白他的思路了,
然后你自己努力把题目完成通过!!!
当你剑指offer60多题目都弄懂,同时PAT甲级题目做了50题左右,
如果你还说自己不懂算法与数据结构,
你就来打猪学长!!!
这个时候你就已经具有扎实的算法与数据结构基础了,
如果你在大一的时候就看到了猪学长的回答,并且早早的开始行动,
大一一年的时间足够完成上面的所有内容学习,甚至努力的同学一学期就可以。
这时候你就具备了参加一些大学里的程序设计比赛的能力了!
<hr/>四、算法进阶提高,了解更多的Oj平台与在算法比赛上摘金夺银!!!

这部分内容猪学长之前写过一个详细的回答:
我现在是计算机大一学生,怎样掌握更强的编程能力、算法等,脱颖而出?在很短的时间内就收获了同学们1300+的赞同,猪学长还是非常开心滴!!!这篇回答也算是对这个回答基础语言学习部分的一个补充。到这里我觉得猪学长的写给所有编程小白的同学们干货算法学习路线就算彻底完结啦!!!


猪学长之前一直都有认真整理很多自己看过的计算机书籍与课程,其中有很多某课上的优质课程是我曾经花了很多钱购买的,现如今猪学长也直接分享给有需要的同学们。
精心整理,助力春招!计算机优质书籍项目推荐分享!同学们如果觉得有帮助的话,不要白嫖猪学长,给猪学长点一个赞吧,
这样可以让跟多的同学看到!
<hr/>五、关于猪学长

来知乎回答问题,完全是因为之前无意间随手写的的一个回顾我本科经历的回答,
大学计算机系最努力的同学都是如何学习的?真的没想到,刚发出不久猪学长手机都爆炸了,短短几天之内收获了很多学弟学妹们2000多的赞同,帮助影响了很多的同学。
于此同时,无数学弟学妹们给我发来私信请教各种问题,这时我才知道原来有这么多的同学对计算机专业的学习,求职,甚至转行都想了解的。
猪学长从垃圾本科一路走来,大学学习,国奖保研,硕士读研,大厂工作方方面面都有一些经验。
猪学长会尽可能工作之余多写一些回答,来把我知道的信息都分享给同学们。
最后贴一下我之前写过的一些高赞回答:
这个是我采访我们大部门今年新入职的双非本科同学阿蓝总结的java方向学习求职路线:
现在计算机大厂985本科是不是难进了?这个是我重点写过关于大学保研相关事宜的:
能给一个计算机本科生的规划提点建议吗?这个是猪学长分享在字节跳动工作实习经历的:
在字节跳动实习是一种怎样的体验?

最后同学如果还有什么问题,只要是计算机相关,互联网大厂求职,技术方向等等问题,都可以在评论区给猪学长留言,或者关注我猪学长哈,猪学长不向同学们开通付费咨询:
@风口浪尖上的猪真心希望可以帮助到你。

RhinoFreak 发表于 2021-8-4 15:15

我必须来答!!!万字长文,我真的一滴都不剩辣!
从一个大学之前都没接触过编程的菜鸡到ACM亚洲区银奖、CCPC全国银奖的混子,有一点感想,来分享一下,希望大家能在算法的学习上越来越好!
本次回答一共分为两部分,第一部分是如何学习算法,第二部分是推荐算法网站,大家各取所需,谨慎食用。
如何学习算法

首先先来说一下如何学习算法,如何量化你学会了,肯定是实践出真知,这里的实践也就是刷题,学习与刷题同步进行,在题海战术的过程中对算法的理解会越来越深。但是刷题呢又不是瞎刷题,什么是瞎刷题,就是看到一道刷一道,这是很多刚开始刷题的同学容易犯的毛病。
有的追求数量,刷了一堆简单题,沉迷在 AC 的快感中不能自拔,在深深的自我感动中依然菜的扣脚。有的追求无脑,看到一道题就去网上搜答案,以为会解决问题,实则搜到了还看不懂,正好一劳永逸,给自己下了不是这块料的断言,成功的做到了开始即结束。
别问我为什么知道,我才不会告诉你当年我就是这样...
其实怎么用正确的题海战术,在我看来,其实也还是两步,第一步多题一解,第二步一题多解。
当然在此之前,我觉得你得先搞明白什么是时间复杂度和空间复杂度,不然不懂这些指标,你也不知道算法对于你当前题目的优劣。之前写过一篇旧文,有兴趣的可以看一下。
Rocky0429:循序渐进带你学习时间复杂度和空间复杂度。0x01-1 多题一解
多题一解,就是把多种同类型的题先放在一起来做,也就是俗称的刷专题。下面是我当年刷题的一部分分类的截图:

很多大佬说做题要追求完美,一道题来 N 种姿势,但是对于刚开始起步的同学来说,一道题带着多解的思想包袱去刷,本身就是一种负担。你很难指望初学者能一上来就一题多解,没那么多见识,脑阔里没储备那么多的算法类型,能够暴力破解且跑通就已经是烧高香了。
这里再多提一嘴,关于网上搜答案这件事,答案可以搜,但是不要上来一看题,感觉自己不会就立马搜答案,要尝试思考,多在草稿纸上写写画画,实在想不出来再去搜。
搜到的答案我不希望你去看别人的代码,按照别人的代码一步步的写出来其实本身没有多大意义,真正有意义的是别人的思路,通过别人的思路来自己实现出现,这才是最应该做的。
这样做的好处是,你可以很快了解一种类型题目的做题方法,加深对某类算法的理解,总结出做题的套路,这算是一种抽象的概括能力。很多时候你就会发现,题目不过是在某类解决办法方面做加法减法。


0x01-2 一题多解
其实这个不用刻意去追求一题多解的能力,刷的专题多了,碰到的题目多了,自然而然你碰到一道题的时候脑袋里就会有想法,觉的可以这样做,也可以那样做,这个时候你就可以对比不同的时间复杂度和空间复杂度,选择当前的最优解法。
说一题多解,其实就是希望你在碰到一个问题的时候能够多想一步,一步一步再一步,不同维度不同姿势都尝试一下。刚开始这可能比较难,毕竟这涉及到一个改变,因为人都是有惰性的,毕竟只求一解比自找麻烦的求多解舒服多了...
题目见的多了你就会发现,很多时候你会碰到这种情况:A 题你有 5 种方法去解决它,改变它的某一个条件变成 B 题,作为 A 题的相似题 B,可能这个时候你照搬 A 的解法来解决 B,你只剩下 3 种或者更少的解法可以解决 B 题,如果你只会 1 种解法,刚好这种解法失效,那你就只能再另想它法。
所以一题多解的好处也是显而易见的,就相当于你的手里多了很多的选项,选项多了不管你在面试或是其它时候,都能手里有牌可打。
在这里我又要多提一嘴,追求一题多解并不意味着“不择手段”的追求题解数量的堆叠,也就是不要过分追求所谓奇淫技巧的解法,而这恰恰是许多同学容易犯的毛病,错误的认为了奇淫技巧等于水平高超,在我看来这个除了能引来别人一句卧槽的惊讶,从而带来一点内心虚荣心的满足以外,其余的用处不大,看个热闹就得了。毕竟鲁迅先生曾经说过:“Use your best judgement”。
当然我也不是全盘否定技巧,但是你连个两三百道题都没刷完,你就在这给我讲你要技巧,我会认为你是在耍流氓...
0x02 实现
一道题有了思路,其实这道题的 90% 你已经解决了,把它实现出来按理来说就是自然而然的事儿了。
当然可能有同学知道了思路,但是就卡在这 10% 不知道怎么实现上,那这就是你写代码的能力问题,其实一样的,这就是不熟练,不熟练的原因就是练少了。
其实这个问题的唯一解还是所谓的“题海战术”,多练习,唯手熟尔。
刚开始的时候不管是书上的例题,一些简单的水题或者你想实现的一个简单的东西,按照你的想法写出来或者看一遍别人怎么写的,自己再一步一步的默敲,不要怕麻烦,一定要自己动手,不要看会了,我们都知道看会了其实不是真正的会。但是慢慢当你习惯了这种方式,你的代码能力会潜移默化的变强。
别问我为什么知道,我难道要说作为一个当年上了大学半年还没写过一次超过 20 行的代码的男人,经过一个寒假以后,能切百十行代码的题?
也太丢面儿了吧,说好的整个学霸人设呢...


0x03 第三步
咦?不是只有两步嘛,哪来的第三步?
嘿嘿,总得给能坚持看我说废话看到这里的同学开个小小灶不是...

其实还有两点是我想说的,而且这两点是我觉得在整个过程中最重要的。
0x03-1 做总结
怎么说呢,做总结这件事的好处,谁做谁知道,不信你就试试...
每道题有每道题的总结,每种类型的题有某类题的总结,千万不要怕麻烦,虽然刚开始的时候确实会很麻烦...
每每回想起来,我最后悔的就是在我刚开始刷题的时候没有做总结。当年集训队老师告诉我们每道题做完都要把题解发布到 CSDN 上,记录自己的思路,解题方式和代码。这件事乍一听我觉得太麻烦,觉得“有这个时间我多刷道题它不香嘛”,一直当作耳旁风。
后来真正开始在 CSDN 上发题解,并不是我突然顿悟,而是集训队老师看我们太懒,强制执行,然而这个强制,在经过初期的不适以后,慢慢的让我形成了做什么都要总结记录的习惯,一下子就写了 6 年。下面是刚开始的一些截图:
习惯性梳理总结,在这个过程中重新产生更多的认识,理解更深,有更多的想法,无论后来成为 CSDN 的博客专家(Rocky0429)或者后来开始写公众号(Python空间,id:Devtogether),都是因为这种积累,我因此而获益,对我们老师感激一生。
0x03-2 保持热情
保持热情,不仅仅是能坚持,而要在坚持上最好能带有一点兴趣。刷题真的是一个很漫长的过程,如何在这个过程中能坚持下去真的很难做到...
我觉得你最好有一个最终的目标,这个很多开始刷题的同学肯定都有,不然没人闲着没事找事去刷题,有了最终的目标朝着这个方向去努力,同时把这个过程分成一部分一部分,比如拿刷专题来说,我这段时间刷链表,下段时间刷贪心,再下段时间刷 dp...
将目标量化为可衡量的每一段,自己有了掌控感,一步一步的向着最终的目标前进,知道自己离着还有多远,不至于半途而废。
拿我自己来说,当年搞 ACM,半年以后我已经准备放弃了,那段时间完全迷茫,觉得自己水平很差,没有机会去参加比赛,不可能拿到奖牌。那段时间我开始去寻找别的出路,去参加 Python 的社团,准备转去做项目。
浑浑噩噩了一圈,最后还是回去做 ACM,一方面是不想让自己半年的努力付诸东流,对拿牌子的执念,更多的是我发现坐在那写项目和做题比起来,我更喜欢 AC 的快感。

以上就是我的一点点经验,其实没有什么新鲜的,有点啰嗦,也不一定能让你有什么进步。我一直觉的只要我们付出了时间和努力,开始向更好的方向迈出第一步,我们解决问题和写代码的能力就会潜移默化的提高。
在这个过程中,收获的远比去解决问题更有成就感,当然这种感同身受更多的需要你自己在这个过程中去体验。
算法网站

在这里我将这些分为三类:收割 offer 版、ACM 竞赛版和提高版。
0x00 收割 offer 版
不管是找工作笔试面试白板试进大厂,还是研究生参加初试复试机试,数据结构和算法都是绕不过去的坎,刷题就成了很多人的需求,快来看看下面这些网站,变身刷题机器,收割 offer 吧!
1、leetcode
英文网址:https://leetcode.com/
中文网址:https://leetcode-cn.com/估计 leetcode(力扣)大家都很熟悉了,都被推荐烂了,很多国内外的程序员在上面刷题,难度从 Easy、Medium 至 Hard 都有,据说很多面试官都会从中挑选各种题目,号称大厂的筛码工。
我很早就知道 leetcode,但是直到准备复试闲来无事的时候才在它上面刷了点儿题找感觉,发现上面的题型覆盖很广,像线段树、滑动数组、博弈论、扫描线等都应有具有,但是好像有的测试数据有点弱?有的题好像可以悄咪咪的水过去…

当然题目都是英文的,现在也有了中文社区,两个网址我都放出来了,还是建议大家首刷英文的,锻炼一下,一举两得,毕竟如果是搞 ACM 的话,题目都是英文的…
2、hihoCoder
网址:https://hihocoder.com网站的技术团队来自于原北大 POJ 的开发团队,至于 POJ 会在后面的篇章中介绍,反正膜拜就完事了。一些知名的大厂比如微软、百度、腾讯、网易等会在上面举办在线编程比赛,风格倒是和 ACM 比赛类似。
如果仅止步于此还不至于让我推荐,当初与它的结缘是因为 hihoCoder 每周有周赛,每月有月赛。周赛是一道题,题目比较难但是极有意思,可以很好的拓宽自己的解题思路,月赛就更厉害了,题目均出自北大等一流高校玩 ACM 的菊苣出题,通过这个的检验可以迅速定位到自己真实的水平,同时了解自身在解决问题过程中的不足。
这将是展示自我真实水平的绝佳机会。
3、牛客网
网址:https://www.nowcoder.com/牛客网作为国内内容超级丰富的 IT 题库,各种东西看的我眼花缭乱,题库+面试+学习+求职+讨论 360 度无死角服务,堪称"互联网求职神器"。它好就好在不只是一个刷题的平台,还是一个交流学习的平台,发个问题贴总有热心的大佬帮助,别问我怎么知道,我才不要说我也给人回答过问题…
说句题外话,我与牛客网的结缘还是因为…它上面有考研真题,我刷来着…
4、计蒜客
网址:https://www.jisuanke.com/计蒜客这个网站可能很多人不知道,他也有可以刷题的题库,也会定期举办比赛,当年和计蒜客有的交集也就是参加计蒜客举办的"计蒜之道"的线上比赛,还赢得过 T 恤,现在好像还在我家放着…
这么多年还记得这个网站的原因,是因为当年在某乎上关注了他们的 CEO,然后竟然被反关,着实把当年的我惊着了…
0x01 ACM 竞赛版
PS:虽然这一部分的标题为 ACM 竞赛版,也只是因为这些在学校搞 ACM 的同学用的比较多,实际上所有的人都可以在下面这些网站上刷题,题目的质量和广度都是顶呱呱的,男女老少咸宜。
搞 ACM 的时候知道了很多 OJ(Online Judge),比如下图(当然实际的数量肯定远远多于图中所展示的这些):


5、HDU
网址:http://acm.hdu.edu.cn/杭电(杭州电子科技大学)的 OJ 大概是国内最火的几个 OJ 之一了,大多数 ACMer 应该都知道(其实我想说所有来着),勿需多说,非常多比赛都在上面,比如每年暑假的多校联赛,朝鲜、外蒙等学校的队伍都会参加,想不知道都不可能。
现在上面大概有接近 6k 的题量,网上有很多的刷题顺序,刷题指南,感兴趣的玩玩儿…
6、POJ
网址:http://poj.org/这个就是我在介绍 hihocoder 的时候提到过的 POJ(Peking University Online Judge),同样作为国内最火的几大 OJ 之一,它的建立时间更早,一些上古时期的题目也能在上面找到,同样 POJ 也很出名,也是我最早刷题的 OJ 之一。
现在上面有 3k+ 的题量,关于 POJ 的刷题指南网上更是很多,同样欢迎去玩儿…
7、SDUT
网址:https://acm.sdut.edu.cn/这个是我打开次数最多,刷题次数最多的 OJ,是我刷题之路开始的地方 – 我本科母校 SDUT 的 OJ 平台。虽然我们学校不出名,但是我们集训队做东西是认真的,上面有接近 3k 的题量,并且在逐渐增多,简单题多一些,很适合刷题。
欢迎大家注册,多多刷题,我们集训队多年一直秉持开放的态度,欢迎多多交流…
8、其它 OJ
最后附带一些其它同样优秀的 OJ 平台:
国内:
ZJU(浙大): https://zoj.pintia.cn/home
USTC(中科大):http://acm.ustc.edu.cn/ustcoj/
FZU(福大):http://acm.fzu.edu.cn/
HIT(哈工大):http://acm.hit.edu.cn/国外:
URAL:http://acm.timus.ru/
SPOJ:https://www.spoj.com/0x02 提高版
这一部分推荐的网站,非常有意思,如果想提高自己,体验比赛的快感,非常建议尝试。
9、Codeforces
网址:https://codeforces.com/Codeforces 又被戏称为 CF,是一家俄罗斯的网站,当然还是用英文食用。这里的很好的比赛,很好的题目,很好的选手,简称"三好"。
CF 最吸引人的地方在于它那超级牛批的比赛系统,CF 上每个用户都拥有 Rating,也就是比赛积分,新用户默认为 1500 分,每次比赛就会在你的积分上加加减减,上面的比赛一般分为四种:Div1、Div2、Div3、Educational Codeforces Round。Div 的比赛一般是根据积分来的,每个积分段只能参加对应的 Div 的比赛,Div1的比赛是里面最难的,大佬基本都在这里。Educational Codeforces Round 则是类似 ACM 的比赛,提交之后立马出结果。
但是如果仅限这些也算不上超级,还有一个更有意思的是,CF 的比赛还提供一个 hack 功能,通俗点说就是你去看别人提交的代码,然后通过提交你想出的特殊测试用例然后找出别人代码的 bug,hack 成功则加积分,比赛更多了很多乐趣,在 hack 和反 hack 中斗智斗勇。
不过对国内来说,和俄罗斯存在时差,一般想参加比赛的话大多数要在晚上 11 点以后,按照基础的 2 个小时比赛时间,再加上 hack 和测评反馈的过程,然后再刺激一下,差不多一宿就这么交待了,不过其中的乐趣不足为外人道。如果没有时间,上面的题目还是可以自己拿来做的,题目质量超级好,很能锻炼自己。
10、Topcoder
网址:https://www.topcoder.com/Topcoder 据说是世界上规模最大的编程网站,如果这样的话那这个 Top 就可以理解了,Top 的 coder 丫,这个我基本上没用过,可能是因为我不 Top,只能仰望
想起它来的原因还是因为现在每次有比赛的时候都会给我发邮箱,搞得我想忘了它都不成…


好啦,今天的回答就到这啦~觉得不错的话,欢迎关注我,记得帮我 @Rocky0429 点个赞呦~mua!

JamesB 发表于 2021-8-4 15:18

题海战术!
题海战术!
题海战术!
<hr/>不知道你们一开始刷算法题的时候是否有过如下的困惑。
1、题目很长,半天看不明白是什么意思2、明明看懂了题目,但写出的代码却提交不通过3、代码写到一半发现不知道怎么往下写了4、别人的题解一看就懂,但自己想破脑袋都想不出要用这种方法5、即使刷了两百多道题目,面试的时候一紧张还是会头脑空白发慌
你问我为啥知道这些?因为我都经历过。
我们都是从应试教育中厮杀出来的,所以对刷题应该是挺熟悉的,缺的只是方法,人人都可以是小镇做题家。
方法是什么呢?
可以归纳为两个,一个是战略,一个是战术,犹如行军打仗,两手都要抓。
在战略上,我们需要做到的是藐视算法题。
在战术上,我们需要做到的是重视刷算法题。
一、战略上藐视算法题

在战略上藐视算法题的目的是为了在心理层面上克服恐惧,事实上,不仅仅是算法题,诸如学习计算机基础、计算机网络、编译原理等程序员必备的知识时,有这个心态可以学起来事半功倍。
我亲身经历过这样的改变。
作为一个转行程序员,在转行学习编程的那段日子,没有人告诉我说要去学数据结构,也没有人告诉我说要去刷 LeetCode,都是靠自己一个人摸索,绝大部分的时间都花在具体项目上,误认为自己和那些已经工作的程序员的区别在于有没有做过项目。
这就是科班出身和非科班出身的学生最大的区别,科班出身的学生知道去学什么,知道大学期间安排的每一门课程是干什么的,知道要先去做哪些小项目来循序渐进的编码练习,知道知识点在工作中能起到什么样的具体作用,非科班出身的程序员感觉计算机相关的知识点简直是一团乱麻。
这种情况导致我去找工作参加面试的时候,很多基础面都通过不了,最后侥幸进入一家要求不太高的创业公司,薪资不高,为了进大厂必须完善算法和计算机的知识。
因为未知,所以恐惧,恐惧导致盲目的崇拜,我认为那些科班出身的程序员太牛逼了,居然可以掌握那么多繁杂的计算机知识;那些写源码分析的程序员都是大神;那些写算法题解的程序员都是高手。
恐惧把小的问题放大,比如学到单调栈、双向链表、记忆化的内容,一看到题目要用到这些概念便觉得代码很难写,索性那些内容就不看,所以学了大半年还在原地踏步,还在原来的公司拿着微薄的工资做着 CURD。
几个月后,创业公司不行了,受迫于重新找工作的压力,只好咬着牙再去啃,再去刷题。
而当我开始写题解、做动画的时候,我就发现算法题也就那样,缺的只是时间去不断的重复练习。
单调栈无非就是在栈的概念基础上增加了排序,记忆化也就是增加一个数组用于存储,动态规划在面试和实际工作中用到的只需要掌握百分之五就行。
抱着编程技术也就那样的心态,学习了爬虫以及 Vue。
“自大”的认为爬虫能有多难,基本步骤无非以下几步:
1、找到需要爬取内容的网页URL2、打开该网页的检查页面3、在 HTML 代码中找到你要提取的数据4、写 Python 代码进行网页请求、解析5、存储数据
下载安装 Pycharm,安装 Scrapy,根据步骤输入 URL 和数据格式,在完全不懂分布式、ip代理、js加密、模拟登陆、MongoDB的前提下,顺利拿到了自己想要的数据。
无论是分布式还是ip代理,爬虫的每个知识点深挖下去都大有文章,我所学习到的爬虫知识只是冰山一角,但这并不妨碍我们可以从战略上去蔑视编程,编程的很多内容没有那么高不可攀,缺的只是时间去学习,时间恰恰是我们可以去支配的。
二、战术上重视刷题

战术,分为道与术。


回顾一下我们以前学数学的过程,会发现,数学题有千千万,最后在脑海中记住的并非是这道题的具体写法,而是解这道题的思路。
算法刷题同样如此,很难做到让你把做过的题目代码都背下来,然后在面试的时候一五一十的写出来,但是你可能知道这道题的思路,用什么样的数据结构和什么样的算法思想,知道可以用这样那样的方法做出来,差的就是细节。
也就是说,刷题和应试教育中的学习是一样的,都需要先经过大量刻意的重复练习,见多识广,才能在面试时做到游刃有余。
说白了,就是要多刷才行。
这里的多刷题,不是指多瞎刷题,而是有方法的去刷,有目的的练习,而一个合理的练习方式,比练习的时间长短,更为重要。
如何做到有目的的进行练习,大概可以分为以下五个步骤:
1、找到具有定义明确的具体特定目标 2、具有专注练习的状态 3、找到导师模仿练习 4、走出舒适圈,突破自我 5、强化前行的理由
1、找到具有定义明确的具体特定目标

目标必须是十分具体的,可以逐个解决,把目标进行分类并制定一个可实施的计划。
目标是什么?
通过算法面试不是目标,而是一个结果,我们的目标是怎么样合理的刷完算法面试需要的那些题目,推荐的做法是按照标签来刷,难度上循序渐进,即把多种同类型的题先放在一起来做,比如一个时间段,只刷链表题,待刷得差不多的时候,接下来再刷二叉树的题。
由于不断的刷同个类型的题目,相当于在不断的重复练习,可以不断地加深自己对某个数据结构的理解,刷到后面可能发现这类题目都是有固定的套路,甚至一部分代码都是一模一样的。
这种刷法不仅在大方向上找到具有定义明确的具体特定目标,即合理的刷完算法面试需要的那些题目,与此同时,当刷同类型的题目出现困惑时,也能有目的性的去搜索相关的特定资料。
2、具有专注练习的状态

不建议在一开始刷题就去搜索一些模板来背,然后在解题的时候套模板,这样的刷题只是重复而不是练习,收获的只是经历而不是经验,背的再熟练,平时写的多块,没有自己的一个完整思考过程,在面试时很容易卡壳。
在刷题的过程中,争取做到三件事:
1、当写出 AC 的代码时,思考为什么自己可以做到
2、当写出 AC 的代码时,思考能不能优化一些
3、是否用到了题目给出的所有条件
很多题目都是由相似的题目改编而来的,增删一些条件题目的难度就会发生巨大的提升,基于这三个思考,每道题目都去多想一步,一步一步再一步,不同维度不同姿势都尝试一下,不要满足于一种解法,各种解法都写一写,争取做到 beat 100%,把每个题目都做干净,彻底攻克一道题。
3、找到导师模仿练习

搜索任何一道算法题,在网上都能发现不少文章,不过很多文章都是只提供解题代码或者加上一些简单的文字说明,为什么要这么写以及是怎么样想到这些方法的很少有文章会涉及到,这些人是高手,却不是导师。
高手和导师最大的区别在于,很多高手未必可以总结出自己的方法论,他们真的很牛逼但核心内容却只可意会不可言传,而导师一定有一套可以复制的方法论,他或许不一定是最牛逼的,但却是最适合模仿学习的。
目前 LeetCode 的题解区有不少大神写了不少细致的题解,找几个你看的顺眼的,模仿他们的思路去思考问题。
然后悄咪咪的吹一下自己,我利用动画的形式讲解算法,写了几百篇文章了,期间有不少人也在模仿我的风格去写作,取得了不错的效果,我最近把精力花在自己的个人网站 AlgoMooc 上,立志于更加细致的讲解 LeetCode,如果你找不到合适的导师,不妨访问 https://www.algomooc.com 来看看我的文章,我争取每道题目都录制视频,用五分钟讲清楚。
4、走出舒适圈,突破自我

当我们跌跌撞撞的刷了一些题目时,实际上,刷题已经变成了我们的舒适圈,在这个圈子中,你已经可以熟练的掌握了一些知识,如果我们想让练习取得成绩,我们得逼着自己走出舒适圈,最好的方法是自己去写题解,写一篇新手也能看懂的题解。
也就是熟知的费曼学习法。
什么是费曼学习法呢?
简单来说就是以教促学,每当你认为学会或者掌握一个知识后,去给别人讲明白,通过这种方式对自己做一个检验,突破自我。
李笑来曾经分享过一个观点,他说教育主要分为 3 个环节——
1、 教:我们最常做的读书、学习、听课等2、 练:就是练习,大量练习,重复练习3、 教练:在练习过程中遇到问题,教练帮忙指出来,然后继续练。
1、2 不断循环,直到把知识、技能练熟,能用到实践中,帮自己做成一些事情,创造价值。
以此作为参考,刷题也是可以分为 3 个环节---
1、学:阅读别人的提交2、练:就是练习,模仿别人的思路来练习3、教:就是教练,通过写题解的形式给别人讲明白一道题目
1、2 两点属于被动学习,吸收效率在 10% 至 30% 之间,而 3 属于主动学习,也就是费曼学习,吸收效率高达 90% 。
也就是说,我们在刷题的过程中,为了提高学习效率,可以主动的去写技术博客分享,注意是写技术博客而非技术笔记,笔记是给自己看的,博客是给别人看的,在这个过程中,表面上你是在教会别人,事实上你通过教会别人的方式来逼自己查缺补漏,你可能以为你懂了,结果发现无法表达出来,事实上还是没有理解透彻;你以为你讲明白了,别人一问,发现还是有遗漏点。
5、强化前行的理由

当初你觉得进行刷题提升自己的时候,什么是你的动力?
这个问题最好在一开始的时候就想清楚,并记录下来。
在《思维的囚徒》一书中,提及到一个原则,叫:自由地选择你的态度 —— 人无论在什么情况下,都可以自由选择自己的态度。事实上,任何一件事情,我们都能找到它的意义,它能帮助自己变得更好的角度。
刷题这个过程必然是有难度的,会给自己很大的压力,所以一开始先把你认为刷题后能带来的积极结果写下来,越多越好,不管现实与否,每当你想要放弃的时候,多想想这些积极的结果,想想熬过这个痛苦的过程能提升多大的改变。


道是从宏观角度来思考刷题,那么术则是在微观的角度来看待每一道题目。
在具体做题的时候,可以采用以下三个步骤来进行。
1、看懂题目2、分析解法3、代码实现
1、看懂题目

首先就是明确题目要我们解决的是什么问题?提供了哪些参考示例?是否提供了需要使用的数据结构和算法?时间复杂度或者空间复杂度有没有要求?提示的范围有没有比较特别的数?边界情况是否需要特殊处理?
怎么样去看懂题目呢?
给你个公式步骤进行参考,即 四步分析法 !
模拟:模拟题目的运行。规律:尝试总结出题目的一般规律和特点。匹配:找到符合这些特点的数据结构与算法。边界:考虑特殊情况。
结合一道具体的算法题来说明整个过程,算法题来源于剑指 offer 上的例题:矩阵中的路径。
1、模拟

首先看一下矩阵的初始状态。
我们需要在这个矩阵中寻找目标字符串 bfce,第一步要做的就是先匹配上目标字符串的第一个元素 b ,我们从矩阵的第一行第一列的元素开始匹配,找到了 a 。
目标字符串为 bfce,此时查找第一个元素为 a ,与目标字符串的第一个元素 b 不相同,需要在四个方向搜索,看看能不能找到符合要求的元素,我们按照上左下右的顺序进行遍历寻找。

上:越界了左:越界了下:是 s ,与目标元素 b 不相同右:是 b,符合要求,依葫芦画瓢找第二个元素

上:越界了左:是 a,与目标元素 f 不相同下:是 f,与目标元素 f 相同,符合要求,依葫芦画瓢找第三个元素

上:根据题目要求不需要考虑左:是 s,与目标元素 c 不相同下:是 d,与目标元素 c 不相同右:是 c,与目标元素 c 相同,符合要求,依葫芦画瓢找第四个元素

上:是 c,与目标元素 e 不相同左:根据题目要求不需要考虑下:是 e,与目标元素 e 相同,符合要求,寻找结束,匹配成功,返回 true
2、规律

1、在搜索过程中,如果当前元素与目标元素不匹配,则回退到之前的节点再搜索2、在搜索过程中,如果当前元素与目标元素相匹配,则按照上左下右的方向进行再次搜索匹配剩下的元素3、在搜索过程中,搜索当前元素的上左下右方向的元素时,会出现重复访问之前元素的情况,比如搜索匹配成功的第三个元素 c 的四个方向时,会重复访问一下 f。
为了保证不重复访问节点,可以将这条路径上已经访问过的节点,修改为不在 word 当中的一个字符,保证以后再次访问时不会重复访问,这里我们将其修改为特殊字符# 。
修改完后会出现一种情况,当前的节点元素与目标元素相匹配,但是在它的四个方向的节点中都找不到可以匹配到目标下一元素的节点。
比如此时当前元素 c 与目标元素 c 相匹配,但是目标下一元素为 x,而在当前元素的四个方向上都找不到 x ,需要把这个点回退,根据之前的操作,当前的节点被修改为了 #,所以为了能够回退成功,再回退操作时需要重新将 # 修改回原来的元素。
3、匹配

本题提供了一个矩阵,矩阵是一个二维数组,需要我们在二维数组中进行搜索,为了能够覆盖所有的情况,必然要使用两个嵌套的循环。
在搜索过程中,当遇到匹配成功的元素,搜索其下一元素的操作与当前的操作一致,即可以使用递归。
递归参数: 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在word 中的索引 k 。终止条件:返回 false:(1) 行或列索引越界(2) 当前矩阵元素与目标字符不同(3) 当前矩阵元素已访问过返回 true: k = len(word) - 1 ,即字符串 word 已全部匹配。


递推工作:标记当前矩阵元素: 将 board[ i ] [ j ] 修改为特殊字符 #,代表此元素已访问过,防止之后搜索时重复访问。搜索下一节点: 朝当前元素的 上、左、下、右 四个方向开启下层递归。回退时还原当前矩阵元素: 将 board[ i ] [ j ] 元素还原至初始值,即 word 。返回值: 返回布尔量 res ,代表是否搜索到目标字符串。
4、边界

1、行越界2、列越界3、矩阵元素已访问过
2、分析解法

在看懂题目的前提下,分析解法就轻松多了, 在脑海中我们已经大概知道了题目想要考察的方向,接下来我们需要思考的是题目的逻辑是怎么样的,不需要考虑代码层面。
需要注意的是,在第一遍或者第二遍解题时,不要过分追求所谓奇淫技巧的解法,很多同学错误的认为了奇淫技巧等于水平高超,我之前也出现过这个误解,很多 LeetCode 上的数学题都能一行或两行代码就 AC,每次自己写大半天发现答案竟然如此简单很是受挫。
后来发现,这些奇淫技巧并不能提高自己的水平,除了发在评论区能引来别人一句卧槽的惊讶,从而带来一点内心虚荣心的满足以外,其余的用处不大。
当然,等你刷个两三百到题目再回过头来重新思考,你会发现那些奇淫技巧的方法是如此的美妙。
3、代码实现

看懂了题目,有了思路,其实这道题的 90% 你已经解决了,把它实现出来按理来说就是自然而然的事儿了。
有时,将一个思路转换成算法是很容易且自然的;但有时,有些思路转换成代码,是很有难度的事情,这就是你写代码的能力问题,其实就是练少了。
刷题说到底还是需要题海战术。
总结

呼,总是写完了。
希望今天的这五千字的经验分享能带给你一些思考:)
最后,我的不少粉丝拿到腾讯字节快手offer,因为用了这套算法刷题笔记:
BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!推荐我自己搭建的一个不错的算法学习网站,讲解视频短,每个视频都精心规划过,全部都有动画过程,争取五分钟讲清楚。
AlgoMooc-一个专属于程序员的平台,和大家一起刷题

johnsoncodehk 发表于 2021-8-4 15:23

学习算法是一个循序渐进的过程,老师在上算法课的时候,因为要在规定的课时内,把知识点都讲完,所以有可能会选择性的跳过一些内容,这种情况下,学生在上算法课的时候觉得很难也很正常。
但是算法又很重要,找工作的时候算法百分之百会考查,所以自己课下多花点时间把算法学好还是很有必要的,我这里整理了一份从入门到进阶的算法学习书单,零基础的小白按照在这个路线去学习,也能看得懂算法,电子版可以直接下载,希望对大家又帮助!
一、入门级别

1、《我的第一本算法书》

这本书是京都大学一个计算机教授和朋友联合出品的动画讲解算法的App 所衍生出来的书籍,非常适合新手朋友们。里面没有枯燥的理论和复杂的公式,而是通过大量的步骤图帮助读者加深对数据结构原理和算法执行过程的理解,便于学习和记忆。将本书作为算法入门的第一步,是非常不错的选择。

链接:https://pan.baidu.com/s/1r_lxqzfg7YTHvAEQhNJwnQ提取码:en9j
2、《趣学算法》

本书从算法之美娓娓道来,没有高深的原理,也没有枯燥的公式,通过趣味故事引出算法问题,包含50多个实例及完美图解,结合学生提问,分析算法本质,并给出代码实现的详细过程和运行结果。本书可作为程序员的学习用书,也适合从未有过编程经验但又对算法有强烈兴趣的初学者使用,同时也可作为高等院校计算机、数学及相关专业的师生用书和培训学校的教材。

链接:https://pan.baidu.com/s/1gg4TXOat08UK-ZziBvCuWw提取码:l55p
3、《啊哈!算法》

《啊哈!算法》一切以实际应用为出发点,通过幽默的语言配以可爱的插图来讲解算法。其中涉及的数据结构有栈、队列、链表、树、并查集、堆和图等;涉及的算法有排序、枚举、深度和广度优先搜索、图的遍历,当然还有图论中不可以缺少的四种最短路径算法、两种最小生成树算法、割点与割边算法、二分图的最大匹配算法等。

链接:https://pan.baidu.com/s/1PLMxdbqLcUmCUs0Ueb6ckA提取码:9yyz
4、《图解算法》

这是一本像小说一样有趣的算法入门书,示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量。书中的前三章将帮助你打下基础,带你学习二分查找、大O表示法、两种基本的数据结构以及递归等。余下的篇幅将主要介绍应用广泛的算法。

链接:https://pan.baidu.com/s/1GZEp8KI1Fm0U4Uek7BOWAw提取码:am4o
二、算法面试必备

1、《剑指offer》

这本书大家一定如雷贯耳吧,基本上只要你是程序员就一定会用到这本书,书里面剖析了50个典型的程序员面试题,从基础知识、代码质量、解题思路、优化效率和综合能力五个方面系统整理了影响面试的5个要点,是程序员找工作必备的一本算法书。

链接:https://pan.baidu.com/s/1GD9yTglFZkn5n__965dKjA提取码:mas8
2、《编程珠玑》

这本书精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行了透彻而睿智的描述,为复杂的编程问题提供了清晰而完备的解决思路。

链接:https://pan.baidu.com/s/1MZLdcMoH7x9A2110567FEw提取码:4te7


3、《编程之美》

这本书收集了约60道算法和程序设计题目,这些题目大部分在近年的笔试、面试中出现过,或者是被微软员工热烈讨论过。作者试图从书中各种有趣的问题出发,引导读者发现问题,分析问题,解决问题,寻找更优的解法。

链接:https://pan.baidu.com/s/1oUHWn6xBeN2VEeYcRVR2CQ提取码:p6l4
三、算法进阶

1、《算法》(第4版)
本书是以哈尔滨工业大学国家精品课程“数据结构与算法”为基础,融入数据结构与算法的最新研究成果编写而成。为普通高等教育“十一五”国家级规划教材,经典中的经典算法书!

链接:https://pan.baidu.com/s/1Pz_8F0blGUBrweEj8Kb9TA提取码:z7ep
2、《算法导论》

这本书真的称得上是算法领域的“圣书”了,如果把它从头到尾看完并且搞明白了,那么恭喜你,年入百万不是梦!

链接:<a href="http://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1Y1kXAyQsZO3MA_kgfa5Jog" class=" external" target="_blank" rel="nofollow noreferrer">https://pan.baidu.com/s/1Y1kXAyQsZO3MA_kgfa5Jog提取码:tl3x


上面推荐的这些算法书每一本都提供了下载链接,当然让你把每一本都看完可能有点不太现实,我把他们分成了三类:入门、进阶、面试。在每个类别里面挑一本书把它认真啃完,你就已经你能超越大多数人了!

闲鱼技术01 发表于 2021-8-4 15:27

阿里的老学长来回答下。学好数据结构和算法,不仅能培养自己的编程思维,还能为以后找工作打下坚实的基础。
因为算法题,在笔试和面试中都会遇到,近年来,大厂的笔试题越来越难,因此提升算法更加重要。
学习数据结构和算法,重点掌握:
10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
提升算法的话可以从看书和刷题两个方面深入。
书籍:
《算法(第4版)》比较经典的书籍,了解基本数据结构和算法,适合入门。但是内容不够全面,比如动态规划这么重要的知识点,本书并没有讲。《剑指offer》这本书虽然是C++的,但是里面的算法思想是很清晰的。如果不想买书,在Leetcode和牛客上也有对应的版块,有很多不错的思路,可以对应练习。《算法导论》里面充斥各种算法的正确性、复杂度的证明、推导,数学公式比较多,看起来比较吃力。如果只是为了笔试和面试,没有必要花功夫在这本书上,了解了基础知识就可以了,把精力花在刷题上。
刷题:
刷题首选Leetcode,至少要刷200道,尤其是hot100,一定要刷。可以按照类别刷,如贪心算法、分治算法、回溯算法这样刷,也可以按照顺序刷,因人而异,个人喜欢按照tag刷,刷起来效果好,能够举一反三。刷完这些,大厂面试中的手撕代码基本没问题了。其次,如果有精力,想拿高分,尤其是笔试的高分,可以刷起codeforces:这是一个国外著名的编程竞赛平台,它在竞赛圈名气比较大。刷起这个,字节、阿里、微软笔试不再是问题!
借用王铮老师的一段话,说下数据结构和算法的认识,对学习很有帮助,有种恍然大悟的感觉。
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。
图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行“存储”。按照一定规律编号,就是书籍这种“数据”的存储结构。
那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学、计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。
从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶,我们可以直接拿来用。我们要讲的这些经典数据结构和算法,都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。
那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢?
这是因为,数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。
比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。
数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。
啊嘞?你都看到这儿了还不给我点个赞呀~

TheLudGamer 发表于 2021-8-4 15:29

主要要有一个循序渐进的学习过程。
我从本科搞ACM刷题到现在作已经十多年了,来说一说我的心得。
学习算法首先是要练习算法,不能只是看书,看书的话,理解还是不深刻。
所以推荐刷题平台:
LeetCode
首先LeetCode上的题目是有打标签的,面试高频题目主要集中在如下几个tag上。
基础的数据结构:数组、字符串、树、堆、栈、队列、哈希表
基础的算法: 枚举遍历, 二分查找,递归,回溯
明白基础的数据结构之后,我们可以发现 leetcode上已经做好了分类, 首先我们要按照类别来刷,推荐刷题顺序: 数组 ->字符串 ->链表->二分查找->排序->哈希表-> 栈->队列 ->树 、递归、回溯 -> 堆
第一次刷leetcode不要去碰什么动态规划,什么深度优先搜索之类的!
每一个类别里面有 简单、中等和困难的题目,例如这样,第一次刷leetcode,建议只做每个类别里面的简体题目,而且简单题目里面先做 通过率高的,如下图,在简单题目里 按照通过率又高到低的顺序做题
这样会避免刚开始做比较难的题目而丧失信心。
开始leetcode闯关:
第一轮刷题

题目类别推荐按照这个顺序来说: 数组 ->字符串 ->链表->二分查找->排序->哈希表-> 栈->队列 ->树 、递归、回溯 -> 堆 ,每一个类别只做简单的题目!而且是从通过率又高向低来刷。
这样刷过一遍之后 我们基础的数据结构和算法就已经差不多了、
第二轮刷题

开始做第一轮类别里面中等难度的题目
同时开始刷更高难度类别的题目,推荐按照这个顺序去做:拓扑排序->分治算法-> 二叉搜索树->贪心算法->动态规划-> 深度优先搜索 -> 广度优先搜索-->图->数学
这里依然还是只做简单难度的题目 按照通过率又高向低
第三轮刷题

开始尝试做第一轮里面的 困难难度的题目 (不强求,仅仅是尝试,面试中也不会太难)
同时开始做第二轮里面 中等难度的题目 (不用全都做,选一下自己一看就有想法的题目)
然后开始做做leetcode分类里面 第一轮和第二轮都没有涉及到的类别的题目,相对于其他类型,面试中最常考察的是: 字典树-> 并查集 -> 树状数组->线段树 , 这里只做简单难度的就可以了!
以上基本刷个 400题左右,就可以应付大厂的算法面试了。
但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目。
对于刷题,我们都是想用最短的时间把经典题目都做一篇,这样效率才是最高的!
我们平时在力扣(leetcode)刷题,浪费的时间主要在哪呢?
如下三点:
找题,昨晚一道题,就要找下一道题,还不知道怎么做什么题合适找到了不应该现阶段做的题,好不容易找到了题,但是感觉有太难了,没有循序渐进没有全套的优质题解可以参考,有的题目找到几篇优质题解,一看就懂了,有的题目找题解找半天,还都读不懂。
如果你刷题,对这三点一定深有体会。
其实我之前在知乎上也回答过这个问题,回答内容大概是按照如下类型来刷数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目。
对于刷题,我们都是想用最短的时间按照循序渐进的难度顺序把经典题目都做一遍,这样效率才是最高的!
所以我整理了leetcode刷题攻略:一个超级详细的刷题顺序,每道题目都是我精心筛选,都是经典题目高频面试题,大家只要按照这个顺序刷就可以了,你没看错,就是题目顺序都排好了,文章顺序就是刷题顺序!挨个刷就可以,不用自己再去题海里选题了!
开始上料:
数组

数组过于简单,但你该了解这些!数组:每次遇到二分法,都是一看就会,一写就废数组:就移除个元素很难么?数组:滑动窗口拯救了你数组:这个循环可以转懵很多人!数组:总结篇
链表

关于链表,你该了解这些!链表:听说用虚拟头节点会方便很多?链表:一道题目考察了常见的五个操作!链表:听说过两天反转链表又写不出来了?链表:删除链表倒数第N个节点,怎么删?链表:链表相交链表:环找到了,那入口呢?链表:总结篇!
哈希表

关于哈希表,你该了解这些!哈希表:可以拿数组当哈希表来用,但哈希值不要太大哈希表:哈希值太大了,还是得用set哈希表:用set来判断快乐数哈希表:map等候多时了哈希表:其实需要哈希的地方都能找到map的身影哈希表:这道题目我做过?哈希表:解决了两数之和,那么能解决三数之和么?双指针法:一样的道理,能解决四数之和哈希表:总结篇!(每逢总结必经典)
字符串

字符串:这道题目,使用库函数一行代码搞定字符串:简单的反转还不够!字符串:替换空格字符串:花式反转还不够!字符串:反转个字符串还有这个用处?视频来了!!带你学透KMP算法(理论篇&代码篇)字符串:都来看看KMP的看家本领!字符串:KMP算法还能干这个!字符串:总结篇!
双指针法

数组:就移除个元素很难么?字符串:这道题目,使用库函数一行代码搞定字符串:替换空格字符串:花式反转还不够!链表:听说过两天反转链表又写不出来了?链表:环找到了,那入口呢?哈希表:解决了两数之和,那么能解决三数之和么?双指针法:一样的道理,能解决四数之和双指针法:总结篇!
栈与队列

栈与队列:来看看栈和队列不为人知的一面栈与队列:我用栈来实现队列怎么样?栈与队列:用队列实现栈还有点别扭栈与队列:系统中处处都是栈的应用栈与队列:匹配问题都是栈的强项栈与队列:有没有想过计算机是如何处理表达式的?栈与队列:滑动窗口里求最大值引出一个重要数据结构栈与队列:求前 K 个高频元素和队列有啥关系?栈与队列:总结篇!
二叉树

题目分类大纲如下:
关于二叉树,你该了解这些!二叉树:一入递归深似海,从此offer是路人二叉树:听说递归能做的,栈也能做!二叉树:前中后序迭代方式的写法就不能统一一下么?二叉树:层序遍历登场!二叉树:你真的会翻转二叉树么?本周小结!(二叉树)二叉树:我对称么?二叉树:看看这些树的最大深度二叉树:看看这些树的最小深度二叉树:我有多少个节点?二叉树:我平衡么?二叉树:找我的所有路径?还在玩耍的你,该总结啦!(本周小结之二叉树)二叉树:以为使用了递归,其实还隐藏着回溯二叉树:做了这么多题目了,我的左叶子之和是多少?二叉树:我的左下角的值是多少?二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?二叉树:构造二叉树登场!二叉树:构造一棵最大的二叉树本周小结!(二叉树系列三)二叉树:合并两个二叉树二叉树:二叉搜索树登场!二叉树:我是不是一棵二叉搜索树二叉树:搜索树的最小绝对差二叉树:我的众数是多少?二叉树:公共祖先问题本周小结!(二叉树系列四)二叉树:搜索树的公共祖先问题二叉树:搜索树中的插入操作二叉树:搜索树中的删除操作二叉树:修剪一棵搜索树二叉树:构造一棵搜索树二叉树:搜索树转成累加树二叉树:总结篇!(需要掌握的二叉树技能都在这里了)
回溯算法

题目分类大纲如下:


关于回溯算法,你该了解这些!回溯算法:求组合问题!回溯算法:组合问题再剪剪枝回溯算法:求组合总和!回溯算法:电话号码的字母组合本周小结!(回溯算法系列一)回溯算法:求组合总和(二)回溯算法:求组合总和(三)回溯算法:分割回文串回溯算法:复原IP地址回溯算法:求子集问题!本周小结!(回溯算法系列二)回溯算法:求子集问题(二)回溯算法:递增子序列回溯算法:排列问题!回溯算法:排列问题(二)本周小结!(回溯算法系列三)本周小结!(回溯算法系列三)续集视频来了!!带你学透回溯算法(理论篇)视频来了!!回溯算法:组合问题视频来了!!回溯算法:组合问题的剪枝操作视频来了!!回溯算法:组合总和回溯算法:重新安排行程回溯算法:N皇后问题回溯算法:解数独一篇总结带你彻底搞透回溯算法!
贪心算法

题目分类大纲如下:


关于贪心算法,你该了解这些!贪心算法:分发饼干贪心算法:摆动序列贪心算法:最大子序和本周小结!(贪心算法系列一)贪心算法:买卖股票的最佳时机II贪心算法:跳跃游戏贪心算法:跳跃游戏II贪心算法:K次取反后最大化的数组和本周小结!(贪心算法系列二)贪心算法:加油站贪心算法:分发糖果贪心算法:柠檬水找零贪心算法:根据身高重建队列本周小结!(贪心算法系列三)贪心算法:根据身高重建队列(续集)贪心算法:用最少数量的箭引爆气球贪心算法:无重叠区间贪心算法:划分字母区间贪心算法:合并区间本周小结!(贪心算法系列四)贪心算法:单调递增的数字贪心算法:买卖股票的最佳时机含手续费贪心算法:我要监控二叉树!贪心算法:总结篇!(每逢总结必经典)
动态规划

动态规划专题已经开始啦,来不及解释了,小伙伴们上车别掉队!


关于动态规划,你该了解这些!动态规划:斐波那契数动态规划:爬楼梯动态规划:使用最小花费爬楼梯本周小结!(动态规划系列一)动态规划:不同路径动态规划:不同路径还不够,要有障碍!动态规划:整数拆分,你要怎么拆?动态规划:不同的二叉搜索树本周小结!(动态规划系列二)
背包问题系列:


动态规划:关于01背包问题,你该了解这些!动态规划:关于01背包问题,你该了解这些!(滚动数组)动态规划:分割等和子集可以用01背包!动态规划:最后一块石头的重量 II本周小结!(动态规划系列三)动态规划:目标和!动态规划:一和零!动态规划:关于完全背包,你该了解这些!动态规划:给你一些零钱,你要怎么凑?本周小结!(动态规划系列四)动态规划:Carl称它为排列总和!动态规划:以前我没得选,现在我选择再爬一次!动态规划: 给我个机会,我再兑换一次零钱动态规划:一样的套路,再求一次完全平方数本周小结!(动态规划系列五)动态规划:单词拆分动态规划:关于多重背包,你该了解这些!听说背包问题很难? 这篇总结篇来拯救你了
打家劫舍系列:
动态规划:开始打家劫舍!动态规划:继续打家劫舍!动态规划:还要打家劫舍!
股票系列:


动态规划:买卖股票的最佳时机动态规划:本周我们都讲了这些(系列六)动态规划:买卖股票的最佳时机II动态规划:买卖股票的最佳时机III动态规划:买卖股票的最佳时机IV动态规划:最佳买卖股票时机含冷冻期动态规划:本周我们都讲了这些(系列七)动态规划:买卖股票的最佳时机含手续费动态规划:股票系列总结篇
子序列系列:
动态规划:最长递增子序列动态规划:最长连续递增序列动态规划:最长重复子数组动态规划:最长公共子序列动态规划:本周我们都讲了这些(系列八)动态规划:不相交的线动态规划:最大子序和动态规划:判断子序列动态规划:不同的子序列动态规划:两个字符串的删除操作动态规划:本周我们都讲了这些(系列十)动态规划:编辑距离为了绝杀编辑距离,我做了三步铺垫,你都知道么?动态规划:回文子串动态规划:最长回文子序列
(持续更新.....)
同时我将刷题攻略整理在Github上,瞬间登上了 Github全球热榜,
上榜了......,Github项目力扣刷题攻略截图:
这个项目里面有200道经典算法题目刷题顺序、配有60w字的详细图解,常用算法模板总结,以及难点视频讲解,按照list一道一道刷就可以了!
去看看吧,这个Github算法学习项目会惊艳到你!
youngyangyang04/leetcode-master也可以在B站上关注「代码随想录」,上面有很多我讲解算法的视频。
代码随想录的个人空间_哔哩哔哩_Bilibili同时我也整理出一份PDF,pdf中不仅有刷题大纲、刷题顺序,还有详细图解,每一本pdf发布之后都广受好评先,PDF中攻击20w字详细图解了 100多道力扣上的经典题目,先上图:
先上图:
赶紧去下载看看,你会发现相见恨晚!
BAT程序员的算法学习手册PDF开放下载!码字不已,希望对你有所帮助!
@代码随想录
点个赞就是对我最大的鼓励,笔芯~

jquave 发表于 2021-8-4 15:37

了解算法知识你可以:1) 等学校的算法课 2)自学看算法书3)上网课自学
实践算法:在oj刷题,比如leetcode,codeforces
边学边实践 而不是啃完书上完课再实践

JoshWindsor 发表于 2021-8-4 15:40

如果已经通过一门编程语言学会编程,继续学习数据结构,算法设计与分析,同时刷leetcode。

ainatipen 发表于 2021-8-4 15:41

动手实践,刷leetcode。
页: [1] 2
查看完整版本: 大一计科生,可以用哪些方法提高自己的算法水平?