数据结构与算法学习资料推荐&LeetCode刷题指北
Posted 川峰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法学习资料推荐&LeetCode刷题指北相关的知识,希望对你有一定的参考价值。
俗话说的好:基础不牢,地动山摇。那么对于程序猿来说,什么才是基础呢?
不是你会用多少框架,会多少黑科技,会八国开发语言,能写出看上去多么漂亮的代码,而是数据结构的应用。数据结构不管是在系统框架源码,还是开源框架中,都有非常重要的应用,因此也被用作很多大厂面试的敲门砖。
其实在国外的企业,像美国硅谷的高科技公司:苹果、Google、Facebook(当然现在应该叫前脸书了,因为脸书今年改名字叫Meta了,自甘堕落元宇宙,不说了)等等,他们在面试时都会将算法作为考察一个程序员的重要标准。
那么为什么大厂这么喜欢考算法呢,这主要是基于以下几点考虑的:
- 算法能力能够准确判断一个程序员的技术功底是否扎实
- 算法能力能够判断程序员在面对新问题时,如何分析并解决问题的能力
- 算法能力能够从侧面反映出一个程序员的学习能力和发展潜力
- 数据结构是设计一个高性能软件、框架的基础,良好的数据结构基础才能构建一个优越的软件
- 数据结构扎实的工程师能够在团队和项目中,发现问题并提出独到的见解,能够给项目经理或团队的Leader提出建设性的参考意见
- 数据结构扎实的工程师能够带领和提升整个团队的开发实力,能在CodeReview时更容易发现别人代码的问题
因此在国外,算法被非常重视,而在国内…emm,大家都在天天忙着写业务代码、忙着赚钱、忙着KPI、忙着内卷。。。因此对算法要求高的公司就比较少,这也是为啥优秀的开源框架总是国外出品,而国内鲜少(即便有基本也是大厂团队出品),数据结构与算法也成为了国内90%以上开发人员的短板。
不管你目前是从事哪个领域的开发工作,前端、后端、客户端,你一定都会接触到所谓的“框架”,那么框架的底层实现最重要的是基于什么,没错,数据结构。为什么大神能写出好的“框架”,而你却只能写出渣渣代码,一个重要原因就在于此。没有一个好的数据结构与算法基础,就很难写出比较优秀的代码。
如果你没有良好的数据结构基础,你甚至连阅读源码都进行不下去,之前我在Okio源码学习分析时就发现,虽然Okio短小精悍,但是对数据结构的应用却很巧妙,对链表的差分和合并,如果你不懂数据结构,你根本看不懂他在干啥。
锻炼数据结构与算法的办法,基本通过刷题练习为主,比较推荐的两个网站:
第一个大家比较熟悉了,现在大家基本上刷题以LeetCode为主,一个原因就是大厂面试基本也从LeetCode题库中抽取。这俩个网站都是国外的,LeetCode分国际版和国内版的,但是中文版对大家比较友好,有余力的可以去刷刷第二个。推荐这两个主要是因为有丰富的评论区可以和别人交流或着看大神的优秀解法。
但是LeetCode这个网站上的题有上千道,如果你一个个去刷肯定是不行的,我最开始的从第一道题开始刷,刷到后面很快就放弃了,所以要寻找一定的方法,最简单的方法呢,就是按照力扣上的Tag标签分类去刷,但是即便是分类完了,还是很难进行下去,因为每个标签下可能有几百道很多,你根本不知道先刷哪个,这些题之间都有什么区别。所以还是要有一个体系的方法论去解决问题。
最开始我是看官方的题解,不得不吐槽力扣官方的火星文题解,有的写的真不是人看的。。。至少不是普通人开发者能看懂的(当然如果你是专业搞算法的大佬,当我没说。。),所以有时我更喜欢看评论区大家的见解和想法,偶然间在评论区看到一个比较不错的、成体系的算法课程,这里分享给大家:
有体系的去解决问题,就能少走不少弯路
这个课程本人已经全部看完,所以我有发言权,他分成了A B两部分,A篇对应:数据结构知识篇,B篇对应:LeetCode刷题篇。总体感觉还可以,主要有PPT动图和视频讲解结合会容易的很多,不像leetCode官方题解有的读起来那么拗口(因为官方题解答案有的是英文直译过来的,或者罗列一大堆的数学推导公式,证明来证明去,这对于大多数非算法专业的同学来说是非常劝退的)。
关于这个课程,我总结以下几个特点,帮助大家快速做出判断:
- 思路的讲解,算法步骤会PPT动画逐步讲解演示,逐行手撸代码,而不像力扣上有的人直接贴出一坨代码,然后加两句话,你看也看不懂
- 多题解的题,会从普通题解逐步过度到最优解法讲解,使你能够了解到从普通解到最优解的性能瓶颈点和时间复杂度的优化过程
- 从简入繁,由易到难,前后衔接,即便是以前没有数据结构的小白也能轻松上手
- 主讲代码以Java为主,但同时提供多种语言版本的代码(Java\\C++\\Python\\JS),再也不用在力扣评论区问别的up主有没有C版本呀、有没有JS版本了。。
- 每小节视频时长比较短,平均时长不超过10分钟,非常适合上班族在路上,地铁上观看,甚至午休时间你也可以看一下。这点也是我觉得比较好的一点,相信对于大多数上班族摸鱼的同志而言比较友好了(偷笑.Gif),还有就是因为压缩了视频时长,作者就会考虑将思路的讲解变得精华许多,而不像有些人一讲就是2个小时,听着就想睡觉,一觉回到了大学课堂。。
我们知道,力扣官方题解区和评论区都有很多大神的给出的解答,但是每个人有自己的风格和见解都不同,一个是不知道看哪个好,更可能别人写的细节你很难理解,然后如果你想搞明白,只能通过评论回复与帖子的作者沟通,那作者他又不能及时的看到你的评论,就比较麻烦。。
如果是看视频,就不一样,每个细节,每一行代码,都会讲的很清楚,不明白的地方还可以在群里跟老汤直接交流,对于理解问题有很大帮助。你会发现有的题目力扣官方也会有视频讲解,但是说实话,我发现几乎没有讲的比较好的(有的甚至像在朗读课文一样)。
当然讲算法的课程有很多免费的文章博客,up主有很多,包括B站上也有很多up主都有免费的视频,你也不一定就是要看我推荐的这个,或许有更好的,但是目前来看,像老汤这样讲的比较完整的、比较成体系的、比较清楚的,我认为是比较少的。如果你有更加优秀的学习资料,欢迎分享给我 ,大家一起学习。
下面就我学习该算法课程视频的经验,给你分享几个建议(如果你打算看这个课程的话):
- 如果你赶时间的话,建议2倍速观看(没办法,老汤讲话比较慢,但倍速也完全不影响理解)
- 如果你已经有数据结构基础的话,A篇可以不看(或快速浏览)直接跳到B篇,如果你没有基础或者基础不太好,千万不要跳过,一定要看A篇
- B篇不要跳着看,他前后是有关联的,越后面也是越难的算法(当然你十分牛逼的话,当我没说,哈哈)
- 理解不了的直接群里问老汤,节约时间,群里也有很多基础不错的同学可以帮你解答
- 有自己的思考,老汤讲的也不一定全对,虽然都是最优解,但写法也不一定是最优的,有好的想法可以直接提出,比如我在观看的时候发现很多代码错误,群里提出后老汤也会马上修改提交Git,这块感觉作者还是比较负责的
- 边看视频边看LeetCode题目题解区的官方题解和高赞题解,以及题解评论区。官方解也是在实时更新的,有时一年前你看他是那样写的,可能现在去看他换了新的最优解法。建议多看几个题解,然后跟老汤的讲的对比分析一下,或许有比视频中更好理解的写法(虽然不是最优但是却容易接受),说不定会有额外收获
- 适度选择难度,根据你的需求来,如果你不是专业搞算法研究的,有些难度是特别难以理解的,可以选择性的放弃
另外群里有人可能会实时的分享一些面试题(最近没怎么关注,我没功夫天天盯着群看),不过老汤好像应该都做了整理,你可以去找他要。遗憾的一点是课件没有开放下载,好在视频你可以反复观看。
最后再说一下,关于数据结构与算法的学习,刷题不是最终目的,面试也不是最终目的,而是通过锻炼,能够去思考如何应用数据结构更优的解决问题,或者说能够明白不同的代码写法,在性能上的差距,这样即便你在阅读源码时,也能明白为啥他要这么写。
以下是废话感想,可以不看。。但看了也没事[嘿嘿]
随着时间的推移,各个行业的技术栈千变万化,但底层实现中唯一不变的是数据结构,因为你可能创造出很多新的框架,但是你很难创造出一种全新的数据结构。不信你可以找一个十年以前的框架看一下它的实现代码再对比下现在的。
可能大多数程序员只是将写代码作为一种谋生的手段,缺乏对代码本身的热爱,这就像一个作家,如果你对写作本身不够热爱,而是被迫写作,就很难写出比较有想象力的作品。
相信大家都听过一句话叫:“美帝掌握核心科技”,为什么都说“美帝掌握核心科技”呢,这么说不是没有原因的,我个人觉得这大多可能要归咎于我国的高校教育模式以及社会企业的运作模式(说到教育模式 ,想到了之前看到的一个比较有意思的新闻,真是一针见血,当然还有这个新闻,相信大家都看过),可以说大环境决定了每个人所处的小环境和思想方式。大家都知道,近年来米国对我们国家很多高科技公司做出了封锁,而很多企业被封锁后,核心的技术被卡住脖子,整个企业都快要生存不下去,这就是只会用人家的东西,而不知道怎么去创造出这种东西的后果。我讲这个的目的,是因为把这个道理放在编程开发领域也是一样的,我们不单要会使用人家的轮子,也要学会创造轮子的基础,这样也不至于有一天人家不给你轮子用了,自己却造不出轮子来。。。干瞪眼
所以,回到我们程序猿本身,永远不要把过多功夫花在如何使用一个框架上,而是放在如何实现上面,假如有一个新框架,你比较聪明1天甚至几个小时就学会怎么使用,那我比较笨可能3天才能学会怎么用,但是,那又如何呢,一周以后,大家都会用了,在大家都会使用以后呢,高级和中级的区别在哪里,你和别人的区别在哪里,你懂怎么造轮子吗?
以上是关于数据结构与算法学习资料推荐&LeetCode刷题指北的主要内容,如果未能解决你的问题,请参考以下文章