前(fei)言(hua):
大约在一年前左右,我第一次打开leetcode的网站。在那之前,我从未想过要进行算法编程方面的学习。作为一名骨灰级AndroidApp程序猿,平时的工作与底层算法毫无干系。我们关心的内容大多是,AndroidOS推出哪些新鲜的功能?Animation又增加了什么绚丽的效果?最近又在流行什么框架?。。。什么?你问我是否关心代码执行效率?对不起,那不是硬件该去解决的问题吗?将你的内存,CPU,GPU,显卡,屏幕再加上手机壳,手机链统统升级一圈,你会发现我的程序速度将得到大幅改善。
算法的重要性
所以我们为什么还要刷题?也许你会快速的回答出来刷题是为了找到更好的工作。那么你是否知道各个大厂为什么在面试时要使用算法题来作为对面试者的评判标准呢?我想大部分人都没有考虑过这个问题,包括我在内很长时间以来都忽略了这个问题的重要性。俗话说面试造火箭,工作拧螺丝。直到一年前我在某个聚会上结识了一位谷歌日本的面试官,他的话让我受益匪浅。在这里简单和大家分享一下。
- 对于题库中的题目,不要试图死记硬背。面试时考官虽然会使用过往出过的题目,但他们看中的不仅仅是你快速的写出程序代码,而是想听到你是如何思考的,讲清楚你的思考逻辑与写出正确的代码同样重要。
- 如果你能拿到offer,你的面试官很大可能会成为你今后一同工作的同事,面试官是否愿意与你一同工作,你的代码质量至关重要。如果你的代码没有逻辑,没有算法,又臭又长很难被理解,这无端会增加他们code review的时间。对于大厂的码农(尤其谷歌),他们是很厌恶加班的,所以你的代码质量会直接决定你面试的结果。
- 将你刷题时养成的思考习惯,活用到你的实际工作中。刷题时通常情况下我们会使用高效率的代码去实现题目要求(至少是为了防止TLE),而很多人到了实际工作中会将刷题时养成的好习惯抛到脑后,恢复到只会使用暴力算法的坏习惯上。这样即使你侥幸拿到了大厂的offer,你也会因你的代码质量而遭到同事的差评,进而增加自身的工作压力。
- 关于刷题数量。很多人喜欢问我刷了800题能通过谷歌的面试吗?其实这种问题很难回答,首先你需要对你有自信,如果你真的拥有足够的实力,即是你没刷过Leetcode,你依然有可能拿到任何一家公司的offer。
总结一下上面的内容,面试时考算法只是一种手段,你需要在解题过程中不断的与面试官进行交流,这种交流实际上是在模拟演练你们今后一起工作时的场景,另外如果你有过刷题的经验,你的代码质量会明显高于其他没有经过训练的人,这是你在大厂工作必备的技能之一。
我们上文中多次提到了代码质量,这个概念非常重要。比如一段程序,如果使用某种高效算法,最多10行就可以解决问题,但如果你不了解该算法,上来就暴力解,自以为使用了几十个if分支加上多层循环就已经涵盖了所有test case,当提交代码后才发现,原来if文还远远不够,经过你不断的调试,不断的改进,你会发现你的逻辑越发的难以理解,难以维护,即使你侥幸的通过了所有测试,这时如果让你马上重写一遍代码,你大概率还是一头雾水吧。这就是典型的低质量代码,而高质量代码的背后往往都是成型的算法逻辑,这些逻辑仿佛就是高手间的暗号,你是否属于“自己人”取决于你的代码是否是“内行话”。如果你想加入大厂的世界,掌握算法的重要性也就不言而喻。
如何刷题?
刷题的关键在于你要知道该题的本质,即考官想考你什么算法,如果你不能快速的想到某一题的解题思路,那么只有两种可能:
- 你根本不会该类题型的解法。
- 你可能知道某算法,但是你没能第一时间想到使用该算法。这只能说明你对该算法的掌握还不够熟练,或者你对该算法的使用场景了解的不够全面。
遇到不会做的题目时,最好的办法就是看答案!因为无论你如何创新,你大概率不会发明出一种更优秀的新算法。记住一点,我们刷题的目的是学习算法,而不是创造算法。起初,你可能发现每一道题你都需要去谷歌一下,而更令人崩溃的是有的题目你连答案都看不懂!这会是你刷题期间遇到的第一个瓶颈,因为你刚刚进入这个圈子,很多算法和概念你都还傻傻分不清,这需要时间去慢慢积累。你可以选择每周巩固一种算法,积少成多,因为你必须相信一点,算法的数量是有限的。
接下来进入本篇文章的重点,到底哪些算法是我们必须掌握的?我们来列举一下(排名不分先后):
第一:二分查找
二分查找类型的题目在leetcode中的比重大约占据了7%左右,这类算法虽然难度不大,但是是二分的边界条件是一个经常出错的地方,下面这篇文章我们着重的分析和总结了每种二分方式下的边界条件问题。
第二:动态规划
动态规划也被称为DP,在leetcode中的比重接近15%,这类题型也是各厂面试官的最爱,如果你仍然无法熟练运用该算法进行解题,强烈建议参考下面两篇文章:
第三:深度优先搜索
刷题时,你会发现大量的树形结构或者图形结构题目,对于这类题目,深度优先搜索DFS算法是你的选择之一。
LEETCODE常见算法之深度优先搜索DFS超详细白话讲解(上)
LEETCODE常见算法之深度优先搜索DFS超详细白话讲解(下)
第四:广度优先搜索
既然提到了DFS,那么BFS也是你不得不掌握的技能,它与DFS的区别和联系有哪些?请看下文:
总结:
其实,你需要掌握的算法远不止上述这四种,但当你对算法有了一定的理解之后,你会发现,所有算法之间都是相通的。而刷题也是同理,当你的刷题量到达几百题时,你会发现很多题目都是相同的,只是他们的描述方式不同,或者他是某几道题的合体而已。另外记住一点,千万不要因为某种算法或者某道题目难于理解而放弃你的刷题之路,对于无法理解的题目你可以选择暂时跳过,当你的刷题量累加到一定程度之后,再回头看那些曾经认为的难题往往会迎刃而解。另外,大家应该知道一个现实,Leetcode中的算法题目实际上是相对简单的,对于很多算法竞赛高手来说,leetcode最多只能作为他们休闲娱乐的游戏,没有任何难度。因此对于我们普通码农来说,不要过于害怕刷难题,难题本身的难点并不在于算法,而在于你如何将题目转化为你能理解的范畴。
本博客今后会继续分享leetcode中最新题目的解题思路,并不定期的更新更多的算法讲解,祝大家刷题愉快!
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode刷题心得-你必须掌握的4类必考题型/
《LEETCODE刷题心得-你必须掌握的4类必考题型》有3条回应