00:00
大家好,这里是任肖晨,欢迎大家来到我的算法面试it金奖。首先,为什么要学习数据结构和算法呢?第一点啊,是面试的需要。大家都知道国内外的互联网公司都需要去进行算法面试,像Google Facebook,或者是像国内的阿里字节这样的公司都喜欢在面试的最后环节呢,让候选人去手写一段代码,解决某个问题。甚至是需要白板编程,在没有任何编辑器的提示下呢?这就需要候选者有比较扎实的数据结构和算法的功力,而且对编码习惯、代码风格、设计模式都有比较高的要求。不管是前端、后端,不管用什么样的语言,这些编程思想和解决问题的方式都是一致的。那么,为什么这么多公司都喜欢去考察数据结构和算法呢?这是因为啊,面试短短的一两个小时,面试官很难去判断候选人的能力,就算是考察以往的项目或者是开发经验。
01:04
由于面试官呢,没有参与过你开发的项目或者是研发方向,所以呢,很难去理解候选人面临的问题和挑战。而考察数据结构和算法,既是对编程基础的考察,又能很好的去考量解决问题的能力和思考问题的方式路径,还有就是考察候选人的编码习惯和风格。不知道大家有没有这样的感觉啊?就是面试了很多公司,一道面试算法的部分呢,总是掉链子,刷了很多题,但是依然写不好,总是挂在手写题上面。或者明明有能力,但是面试的时候呢,就是说不出来,究其原因呢,就是缺少正确的刷题方式和方法,以及可以练习。第二点呢,就是我们核心能力的提升。数据结构和算法呢,是程序员最核心的能力,不管是负责什么样的业务,不管是前端、后端还是人工智能领域的工程师,这项能力呢,都是一个必备的最基础的能力。
02:05
为什么数据结构和算法这么重要呢?我们日常开发用到的大量的框架和库,都是以数据结构和算法为基础设计出来的。举一个例子啊,React源码中呢,用到了大量的链表,还有小顶堆这样的数据结构。作为使用了多年的工程师,如果对日常使用的框架,它的底层原理和运行逻辑没有一个大概的认识,怎么可能设计好一个技术方案,或者是做好技术选型,还有项目优化呢?数据结构和算法就好比武侠小说里面的内力,而大家所学的框架和库都是招式。框架经常会变,而数据结构和算法却是最基础也是最核心的能力。招式用的好不好,打出来的效果怎么样,都需要强大的内力来支撑。所以呢,千万不要说这些数据结构和算法我平时用不到啊,其实恰恰相法,如果想深挖技术,想用算法提升程序的运行效率,或者是提高自己的编码能力,学习数据结构和算法是一个非常好的方式。
03:15
这也是我们的核心竞争力之一。第三点啊,就是提升职业生涯的高度。不知道大家有没有遇到过一些技术很厉害的程序员,不管在哪家公司,他们总能找到自己的位置,随着时间的推移呢,独立负责一个项目或者是带团队都是迟早的事情。想要职业生涯走的更远呢?就需要我们不断的去精进自己的技术和能力,比如程序员最核心的数据结构和算法的能力。当然,如果走到了技术的管理层,还需要有技术的前瞻性和管理能力。这些都是需要方法和刻意练习的。时刻保持危机感,不要只停留在某个技术的使用层面。
04:00
只有这样呢,才有更多的机会。这里我分享一些个人的经验。不要去相信所谓的什么35岁危机,本质就是到了相应的年龄就需要更高的能力,不要做无效的内卷,但是基础的数据结构和算法却是必须的。底层的能力才能决定我们能够走多远。那么,我们应该怎样去学习数据结构和算法呢?首先啊,是需要去了解最基础的数据结构。比如说列表、站队列数等等。可以接触博客、书籍或者是课程进行学习。书籍呢,比如说javascript,数据结构与算法。还有一些其他类型语言的设计结构。或者是算法的书籍。这里不推荐算法导论,因为推理和证明性的内容比较多。第二点呢,是按照类别进行刻意练习。比如说按照上面的类别进行刷题。
05:01
可以按照动态规划、分制回溯这样的分类进行练习。it code上面的题目虽然非常多,但是如果按照类别来说,其实没有多少。很多题目呢,都是类似的套路和延伸,掌握其中最热门的100多道题,就足以应付面试了。接下来我们来看一下如何刷题,首先呢,是切碎知识点。对于每一个类型的题目啊,我们可以形成一套解题思路或者是模板。比如说动态规划的解题步骤就有。根据重叠子问题定义状态,然后根据最有子结构推导我们的状态转移方程,然后就是确定DP的初始状态,最后确定输出值。第二点呢,是去刻意练习,我们要去练习那些缺陷的弱的地方。那些写起来不舒服或者是不爽、枯燥的题目就是我们的薄弱点。不要只去练习那些熟悉的类型。
06:00
第三点呢,是接受反馈,在little code上面呢,去寻找别人的解题思路,包括评论区里面的讨论。还有就是程序运行的时间和占用内存情况。这里顺便说一句啊,It code上面的运行时间和占用内存情况,它的数据有时候是不准确的,我们就当一个参考就好,不要太在意运行时间的排名。第四点呢,是去多写,反复的去练习,加强记忆,正所谓三分学,七分练。第五点呢,是去总结规律,将刷题的套路总结成自己的方法。比如说问题的拆解,寻找基本的子问题,问题的组装,数学归纳等等。最后呢,这些方法落实到代码层面,无非是if else for、循环Y循环DV等等。总结这些规律呢,才能在题目变化的时候,还能寻找到最正确的解题路径。题目做多了,你也会有相应的感觉,有时候从题目的要求中也能够明显的感觉到该用什么样的算法。
07:07
比如说题目中提到了用log n的时间复杂度来解题,那很有可能用到了二分法。提到了用n log n这样的时间复杂度,那很有可能是用到归并或者是快排的思想来解题。接下来我们来看一下面试的时候应该如何去做一道题目。首先呢是明确题意,如果有不清楚的地方呢,要和面试官去明确题目的意思。包括程序的特殊数据的输入、数据量,还有一些边界条件等等。然后呢,是可能的解,我们在解题的过程中呢,要尽可能的列出你知道的方法,对比他们的优劣势,选择你认为最好的方法进行编码。我们不要去小瞧暴力解法,它往往是题目的思考和优化的起点。然后呢,写完之后要进行复杂度的分析,包括时间和空间的复杂度。
08:03
面试官呢,往往是考察思考问题和解决的方式,我们要尽可能的让面试官看到我们的思考路径和过程,即使最后的运行结果不太正确,也不一定会影响我们的录用。可能就是因为某个条件或者是返回值出现了问题。在面试的过程中呢,如果完全没有思路,也可以向面试官寻求提示和帮助。毕竟人无完人嘛,就算是在平时的工作中,我们也会遇到困难,这不丢人。积极的去寻找帮助,也是推进项目前进的方式,没有问题有时候才是最大的问题。如果确定这道题目是你完全没有遇到过的,也可以要求面试官更换一道题目。与其浪费时间思考,不如直接换一道题目,也许更换了之后呢,就是我们熟悉的题目了。知识点和题目这么多,每个人都有自己的知识盲区。
09:03
不要想着面试官是你的监考老师,而是你未来的同事,面试呢,不是考试,大多数的题目呢,没有标准的答案,有时候只是需要你表现的比其他候选人更好一点就可以了。我们来看一下这门课程有什么特色。首先是对lead code上面的高频面试题进行分类讲解,讲到对应的题目的时候呢,会介绍对应的数据结构,它有什么特点,以及它的实现。比如说堆的实现,字典数的实现等等。然后会介绍这道题目相应的算法,比如说递归、回溯、探析、动态规划等等,每一道题目呢,都会列出尽可能多的解题方式以及复杂度分析。然后会讲解思考路径。同类型的题目呢,我们也会去总结相应的解题套路。比如说二分法、双指针动态规划、深度优先、广度优先等等这些算法的解题模板。
10:02
然后呢,就是题目量和难度都达到了面试的要求,这门课程目前包含174道高频面试题,其他类型的问题呢,基本是这些问题的变种和延伸。其中难的题目呢22道,中等的题目呢23道,容易的题目呢69道,每一道题目呢,都有详细的注释,后面还会去更新更多大厂的高频面试题。接下来呢,就是去节省大家的时间。难的题目呢,理解起来比较困难,解法又看不懂,花了大量的时间刷题还是刷不会,这可能是大家最头疼的问题了。这门课程呢,会讲解一些必要的前置知识,相应的解题。套路,还有大量的图解和视频讲解,不多废话,做到通俗易懂,节省大家的理解成本和刷题时间。在面试前几天呢,可以帮助大家快速进入到一个刷题的状态。
11:00
还有就是解题的语言,这门课程呢,主要是用javascript来解题,也会附上Java的解题代码。数据结构呢,和算法与相应的实现的语言没有太大的关系,不管你是用Python还是用go。其实理解了逻辑和算法。只需要相应的修改一下if else,或者是for循环,Y循环,或者是修改一下数组和对象的声明,就可以改成对应的语言来实现了。那么这门课程适合什么样的人群呢?首先是应届的校招生,校招的门槛呢水涨船高,对同学们的能力呢,要求也是越来越高,当然薪资也是一年比一年高。做到提前准备,提前刷题,对于正在处于即将毕业阶段的计算机学科的同学来说还是非常必要的。还有就是算法薄弱的在职工程师。社招的同学如果想进入BAT、美团字节这样的公司,算法的考察是必考的。
12:03
就算是一些中型的公司,现在也越来越多的考察同学们的基础能力的。对算法的考察也是非常重要的一个环节,接下来我们来简单的介绍一下这门课程的大纲和目录。首先呢,第二章我们会介绍时间和空间复杂度。我们会介绍大O表示法,然后会介绍在实际的面试的一个过程中,我们应该怎样去分析一道题目的算法复杂度和空间复杂度,然后呢,我们会分为算法、数据结构和其他类型的题目这三大模块来进行分类的讲解。比如说算法这个模块,我们会分为动态规划、贪心等等等等,像分类来进行讲解,数据结构呢,我们会分为堆、单调站、电表等等。然后呢,我们也会去介绍对应的实现,字典数的实现等等,也会去介绍对应的一个数据结构的特点,还有它的复杂度,还有一些算法的解题模板,我们都会去进行讲解。这里顺便说一句,我们为什么要先讲算法,然后去讲数据结构呢?
13:07
因为我们在数据结构这些分类中的题目呢,会大量的用到我们的动态规划,二分查找、双指针等等这些解题的算法,所以呢,我们先讲算法,然后再讲数据结构。
我来说两句