字节面试官问我:有没有刷过leetcode,怎么办?
最近面试,我发现有些基础知识答得很好的同学,但是做算法题非常非常吃力。有时候我把答题思路都讲了,但是作答也非常不顺利。我有点费解的问有没有刷leetcode,同学说刷了100道左右题目。在我看来,其实100道题已经不少了,所以我觉得应该说一下应该怎么学习算法,如何做练习
为什么面试要考算法?
考察算法的一个非常重要的原因是:它包含了太多的逻辑思维,可以考察你思考问题的逻辑和解决问题的能力;这一点也是面试官比较看重的,因为它可以反映出你的潜力,我曾经听阿里一位资深面试官这样讲过:当一个人逻辑思维和能力不错的情况下,你还会担心专业的业务知识方面他不行或者学不会吗?
针对算法面试,我列举了以下几个问题并做出了解释
如何取得正确的思路
即使面对简单的题目,也有相当一部分是拿不出思路的。这和聪明不聪明完全没有关系,这说明需要更多的算法锻炼。有一些方法可以帮助:
- 多画画图,不要着急写代码,先在图上想清楚,画出每一步要做什么,看看是不是有漏洞,或者有什么启发
- 从简单的开始,比如一个数组,那就从一个数开始考虑;无序的数组,先考虑一下有序的是不是有什么启发;情况复杂,不确定东西多,是不是分成几类,每一类都只有一个或者两个不确定的变量;有了启发再去推广
- 如果想了5-10分钟,都没有收获,还是看看答案吧,可能只是因为你见识的太少了
如何把思路变成代码
这个就是要靠练习了,不过这种练习也要多个心眼才能效率高。其实思路改成代码的时候是有很多重复的基础动作的,比如遍历,从某个数组里选最大值,把链表反转等等,仔细留心自己每次哪一块实现不出自己的想法,那就多去练习一下这块的操作,自然很快就能提高。其实写代码就好像是翻译,把思路用另外一种语言写出来而已。其中当然有很多固定搭配和短语了,多留心总结就提高得快
如何做到代码优雅
过了上面一个阶段,就会发现,正确实现往往很简单,但是实现出来的也是一堆的if else,或者看起来就笨笨的。这时候就要参考答案。比较一下。自己写的啰嗦,可能很大程度是思维的抽象度不够,这个就需要多练习。别死记硬背别人的解法,而是看看他简洁的代码到底在表达什么意思?而自己啰嗦的代码可能是使用了重复的逻辑。这个只能靠多练,多感悟了。
如果能用优雅简单的代码写出答案,即使算法不是最优解,也会大大赢得面试官的好感。而且有了这个基本功,剩下的学习就会事半功倍。并且万一面试的时候没想到思路,面试官提示一下,也是分分钟搞定,必然面试官感到你基本功扎实,代码能力好
这里给大家推荐一本书,左程云老师写的《程序员代码面试指南》
程序员代码面试指南
这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失。
另外,除应付面试之外,还有很重要的一点,甚至是更重要的一点,就是本书可以帮我们打开思路,因为很多算法题的解法是需要逆向思维的,需要跳出原有的固定思维模式,当思维模式被打开之后,你会发现原有的事物现在看起来会有不同的看法,因为看问题的角度变了。不过这些只能自己体会(只可意会不可言传)。
目录
采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化。书中将所有的面试题从难到易依次分为“将、校、尉、士”四个档次,方便读者有针对性地选择“刷”题。这本书所收录的所有面试题都给出了最优解讲解和代码实现,并且提供了一些普通解法和最优解法的运行时间对比,让读者真切地感受到最优解的魅力!
限于平台篇幅原因,只能展示部分内容和目录截图,
有需要的小伙伴加V:bjmsb02 凭截图即可获取!
内容
第1章栈和队列
第2章链表问题
第3章二叉树问题
第4章递归和动态规划
第5章字符串问题
第6章大数据和空间限制
第7章位运算
第8章数组和矩阵问题
第9章其他题目
限于平台篇幅原因,只能展示部分内容和目录截图,
有需要的小伙伴加V:bjmsb02 凭截图即可获取!
最后
引用高鹏义老师的一句话:
年轻人总会找借口说这个东西不是我感兴趣的,所以我做不好是应该的。但他们没有注意的是,你面对的事情中感兴趣的事情总是少数,这就使得大多数时候你做事情的态度总是很懈怠、很消极,这使你变成了一个懈怠的人。当你真正面对自己感兴趣的东西时,你发现你已经攥不紧拳头了。
对一个东西,如果你没有透彻研究过,不要轻易说它不精彩。这不是博爱,而是对自己认真。