算法刷题的重点和坑
现在对于技术岗的求职者来说,无论是校招还是社招,无论笔试还是面试,考察算法几乎成了标配。
校招的同学请尤其注意,算法对于校招更加重要,因为你还没有工作,问不出什么正儿八经的项目实战经验;问你八股文吧,都是有标准答案的,玩不出什么花活。而且现在 chatGPT 这么厉害,会背八股文这个技能的价值又降低了。
只有算法是唯一的变数,可以有比较大的考察空间,所以比较好的公司校招都要考算法,这东西很适合拿来筛选校招生。
我会建议校招生提前开始准备,趁着时间充裕,把本站的内容都过一遍,可以系统掌握数据结构和算法,这样可以免去日后工作跳槽的很多麻烦。
对于社招,工作经验无疑是最重要的。好公司招人也考算法,但一般也就考到 medium 的难度,不会特别难。
所以本站提供 速成目录,专门针对算法笔试,帮助时间不充裕的读者解决燃眉之急。
这里我不探讨算法在工作中有什么实际意义,只针对算法刷题进行科学地分析,并针对不同读者给出高效的解决方案,帮助大家提高算法能力,算法从此不再是求职的绊脚石。
求职中如何考察算法
在技术岗求职的语境下,我们所说的「算法」,一般包含两大块,一个是数据结构,一个是算法,它们的考察形式是不同的。
「数据结构」这部分相对简单,一般只会在面试中考察。比如面试官问你哈希表的原理是什么,为什么它的增删查改效率是 ,以及一系列的追问。这种问题类似于八股文,你只要认真学习理解过,都比较容易回答。
本站的入门章节介绍了所有常见的数据结构的原理及实现,如果时间充裕的话可以动手跟着实现一下,以便加深理解。但如果时间不充裕,把原理理解透彻就行了,一般不需要你手搓数据结构的实现。
「算法」这部分应该是最让大家头痛的,也就是俗话说的手撕算法题,直接给你一道题目,你需要写出解法通过判题系统。
手撕算法题 100% 会出现在笔试中,属于硬指标,过不了的话面试都没机会。大部分面试中,面试官也可能让你现场手撕算法题,不过相对来说会容易一些,因为实在不行你可以跟面试官交流嘛。
本站除了入门章节是数据结构专题章节外,其他所有内容都是围绕算法解题技巧展开的,而且有时间一定要亲自动手做一做,这样才能真正掌握算法技巧。
刷算法题的关键点在哪里
刷题的关键点在于,构建一套你的解题方法论(本站中经常称之为「框架思维」)。
具体的题目没有价值,昙花一现的技巧也没有价值,成体系、可稳定复现的方法论才有价值。
本站实际上就是我总结的一套思维框架,而不是简单的题解堆砌。你把这套方法论学走,才配得上你付出的时间和金钱。
在遇到新的题目时,这套方法论可以给你提供切入点,逐步优化,最终写出解法代码。
算法就像数学考试,死记硬背没有用的。遇到新题就没思路,根本原因就是没有掌握属于自己的方法论。
为什么本站能速成
中学时代,见过那种每天认真听讲做笔记,依然考不好的同学吧?也见过那种天天上课睡大觉,但依然考得好的同学吧?其实学霸的秘密,不在于笔记记得有多工整,而在于「抽象能力」。
譬如编程,一个父类可以产生若干子类,一个子类又可以有无数个实例化。
如果你执迷于一个个实例化的细节,那完蛋了,即便背诵一千个实例化,还有一万个等着你呢;如果你能从细节跳出来,透过实例化看到父类,一万个实例化,在你眼里其实只是同一个,那自然可以以不变应万变,这就是抽象的力量。
在本站开篇的 学习数据结构和算法的框架思维 中,我提到了两句话:
数据结构本质上只有两种,一种叫数组,一种叫链表。其他乱七八糟的都是它们俩的衍生。
算法本质就是穷举。花里胡哨的算法名称都只是名词而已,它们做的事情都本质都是穷举。
有这两句话作为指导方针,数据结构和算法根本没有什么难的,你以前觉得难,是因为没有从这两句话进行切入。
有了这两句话撑腰,就能大杀四方了吗?也不行,下一步是要把这两句话具体化。
比如说,针对不同题目的穷举方法是不同的,你就需要对这些场景进行归纳总结,把重复的部分流程化、框架化,这些框架就是你的解题方法论。
本站的核心框架章节,就是针对常见的算法题总结出了几套框架。
有了这些框架,就能大杀四方了吗?还是不够,下一步是通过不断地实践,把这些框架内化,做到随心运用。
本站目录中标有「强化练习」的习题章节就是这个目的,针对同一套框架进行大量的重复练习,直接给你练出肌肉记忆,真正拥有自己的解题方法论。
综上,就是我探索出的科学的刷题方法,本站的所有内容都是围绕上述过程展开的。
算法学习的几个坑
坑一:被误导,浪费时间
尤其是初学者,特别容易被误导,以为算法很高大上,非要有很好的数学基础,非要啃完算法导论才算是入门,所以从心理上就畏惧算法。
我对这个问题有切身体会,刚学算法那会儿,我会去搜索过各种资料、经验贴之类的,我就记得很多所谓大佬,你问他怎么入门算法,他告诉你看《算法导论》,然后又甩给你一堆英文课程,还强调一定要看英文的哦,中文的翻译不好。
这就好比,你是一个胖子,去问人家怎么减肥,人家告诉你,每天做 100 个俯卧撑,200 个引体向上,肯定有效,你看我就是这样练出来的!
呵呵,我要是真能做到这些,还用得着来问么?不过仔细琢磨琢磨,给出这种回答是基于一种什么心理?实际上他根本不在乎你的诉求,他只是想告诉你:我做过这些,我牛逼吧,你羡慕吧,你做不到吧~
一些算法的专业书籍都是好书,内容也很硬,但目标用户不一样。大多数人只是为了找技术岗的工作,看这些书性价比真的太低了。
什么性价比高?直接刷题。方向首先要明确,只有刷题是正道,其他的都是辅助手段。如果这个学一点,那个学一点,感觉懂了很多,但最后一笔试发现啥都用不到,傻眼了,找谁说理去?
坑二:贪多,贪巧
何谓「贪多」?有些读者可能陷入到追求量的陷阱里。比如一些培训机构,标榜自己有几百 G 的资料,内容大而全。
在我看来,量多不是优势,反而是劣势。咱就实话实说,哪怕这几百 G 的资料真的不错,你会花那个时间和耐心去看,还是放到收藏夹吃灰?
尤其是算法这种偏实践的东西,你光看是不行的,若不动手去练习,终究是纸上谈兵。
何谓「贪巧」?大家肯定会被力扣评论区里面一些大佬的精彩解法吸引,但是我想说,在培养出自己的框架思维之前,不必追求一题多解。
追求一题多解当然是好的,但如果你还没有掌握自己的解题方法论,那还是先老老实实练习本站的框架思维吧。
学到后面你就能体会到了,大道至简,算法就是穷举,本站的全部内容都是围绕这两个字。大部分情况下,按照框架写代码,逢山开路遇水搭桥,见招拆招逐步优化,最后写出来的就是最优解,和那些花哨的算法效率是相同的,你以不变应万变,何乐而不为呢?
坑三:刷题没有章法
明确了主要方法是刷题,那么接下来的坑是:刷题没有章法,乱刷一通,胡子眉毛一把抓。力扣上几千道题,你是准备全部刷完背下来么?
我不否认大力可以出奇迹,比方说你如果真能刷个一千道题,你肯定会有一些感觉的。但问题是,我有一妙法,可以让你刷一道顶十道,你想不想学呀?想吧,其实很简单,刷题不要贪数量,而是要归纳总结,高度抽象,最终目标是培养出自己的框架思维。
说白了,那么多算法题,大多都是换汤不换药,你把药方记住了,汤换来换去,你都是照方抓药,不是么?
为啥我这么强调这个框架思维?因为它可以从根本上解决你遇到新题无从下手的问题。
比方说吧,如果你掌握了框架思维,现在随便给你一道题目,那你就可以按照固定的思维步骤进行思考:
这题让我们干什么?奥,让我们操作字符串。字符串本质就是个数组,所以这题考察的大概是数组相关的算法技巧。
数组有什么算法技巧?你心里有数,无非就是 二分查找、快慢指针、左右指针、滑动窗口、前缀和数组、差分数组,主要就这些。
二分查找的适用场景是什么?差分数组的适用场景是什么?你挨个想一遍,这个不行换那个,总能试出来个相对靠谱的吧?
好,比方说你最后感觉这个题用滑动窗口比较靠谱,那么换一般人,你告诉他这是滑动窗口,他大概率半天憋不出来一行代码。但你不一样,你知道滑动窗口的代码框架,所以你是先把框架写出来,然后往框架里面填充代码。
如何填充?简单啊,滑动窗口核心框架 总结过了,用滑动窗口要自问三个问题,你回答一下这三个问题,然后这个题就写完了,提交代码一遍过。爽不爽?
爽吧,那我再给你 100 道 滑动窗口习题,你都按完全相同的套路,改点细节就都解决了。这时候,你觉得算法还难么?