想学算法,应付笔试或者面试手撕算法题,相信大部分人都会刷Leetcode。有读者问?如果我坚持在leetcode刷500题,以后笔试/面试会稳定吗?
以下是我个人的看法。我觉得不稳.让我们来谈谈为什么它不稳定,以及如何刷和学习算法问题。当然,我们也会推荐我们学过的材料。
一、先说说笔试题
刷leetcode的时候会发现每个问题的意思都很短。你只需要十几秒钟就能知道这个问题对你来说是什么。而且每道题的算法思路都很清晰,比如动态规划、递归、二分搜索法等。你可能很快就知道用哪种方法了,只是不知道代码怎么写。
到了笔试,就完全不一样了。在笔试中,大部分的题目都是情景题,每道题看完可能都要花很多时间。偶尔可能会遇到一个问题,不知道题目想让我们做什么,而且有时间限制。每个问题分配给你的时间估计是30分钟。这里随便抛个问题给你(去年Shopee的真题)
而且你可能不容易看出这些问题该用哪种方法。可能是各种方法的组合(当然不是指这个问题)。
也就是说,在leetcode中,硬水平的题可以做,而在笔试中,中等水平的题受时间、心态等因素影响。你可能还做不到,当然大老板除外。先说一些题型,以及如何学习算法。
在笔试中,我认为主要有如下几种题型:
1、基本数据结构的考察:我觉得这类问题比较简单。主要处理考场基本数据结构的操作,如二叉树的顺序遍历、链表的逆序等。当然,它不会直接告诉你,让你做逆序或者遍历。例如
2、某种算法思想的掌握:如果你掌握了一些算法思想,这类问题会容易一些。如果没有,那就爽了。如动态规划、回溯、枚举、深度/宽度、贪婪、二分法等。其中,我认为动态规划参加了很多考试,回溯+深度/广度是最重要的一个。例如
所以,常用的算法思路一定要掌握。
3、边界条件的考察:估计你第一眼就会有想法,知道怎么做这种题。但是它有很多边界条件,很多情况需要讨论。特别容易出错。有时候,人会被困住,变得越来越复杂。这类问题主要考验你思维的严谨性。例如
4、找规律、数学公式:这类题型主要是根据数据之间的一些关系找出一些规律,然后推出它们的通用公式,就像我们在高中的时候,在一个数列中寻找同一个项目一样。例如
二、应该如何刷题?如何学习?
上面提到了试题的一些情况,以及重点考察的一些问题。对于这些问题,我觉得你在刷的时候应该做到以下几点。
1、分类归纳/总结
诱导?总结一下?估计大部分都知道归纳总结之类的东西,不知道有没有付诸实践。
(1)、数组和相关题型
对于算法问题,还有很多种问题需要总结。如果你知道这个问题,以后遇到类似的问题,相信你很快就能做到。有哪些类型的问题可以总结?是的,很多:例如
(1),给你一个非负数组,求最大子数组和的长度。
这是一个问题类型。关于这个题型有很多变体和扩展。这里建议一起总结一下,比如
(2)刚才给的数组是非负的。现在改变它,给定的数组可以是正的也可以是负的。
还能继续扩张吗?是的,举个例子
(3)给你一个矩阵(即二维数组),求子矩阵最大和的面积。
还有别的吗?对,比如刚才我想求最大和,现在我想求最大积。
我举以上例子只是为了告诉你,我建议分类刷题,总结题型进行早期研究。
ong>,像我上面举的这些例子,在笔试/面试中还是比较常见的,如果你懂得对应的方法,就可以秒杀了,因为这类题,没啥边界或者规律。例如我刚才距离的Shopee的零食柜那道题,实际上就是数组切割题型,相当于给你一个数组,让你切割 n 下,那么可以把数组切割成 n + 1 个子数组,怎么样切割,才能让最大子数组的和最小?关于题型的,还是很多的,我这里无法一一给你列举,只能靠你刷题的过程中,进行分类、总结。不过我可以给你推荐一些资料,后面推荐哈。下面我在说一些题型吧。
(2)、基本数据结构操作相关题型
刚才我说了,笔试题的考察,有一类题是基本数据结构的考场,而且,这类题在面试中,也是高频考点,在笔试中,倒不是很高频。对于这类题,我觉得你愿意去总结,那么以后遇到,问题不大。例如
链表的各种操作:逆序(部分逆序、按某种条件逆序)、判断是否有环,环的入口节点、删除指定节点等。
二叉树的各种操作:各种非递归的遍历操作(前中后、层)、二叉树的公共祖先、根据前中后的遍历结果来重构二叉树等等。
队列、栈相关操作:最小栈、来队列来实现栈等。
(3)、字符串相关问题
不得不说,字符串相关问题,估计考的最高频,而且,我可以告诉你,对于字符串相关问题,90% 可以用动态规划来解决。反正对于字符串问题,我一般想法就是能否套用动态规划,字符串问题有点多,不过你有时间,建议总结。例如:通配符的匹配、最长公共子串、最小编辑代价、最长回文串等等。大部分都是用动态规划,而且,我觉得解法都差不多,所以强烈建议专门花一段时间来做、总结、归纳。后面我也会写这方面的算法文章,敬请期待。
2、多思考/动手,提高自己的思维完整性/灵敏性
(1)、边界、找规律题型
刚才我说有一类题型是边界特别多的,对于这类题,我觉得不好总结,这类题考察你逻辑是否严谨,能否化繁为简。这里我建议多做几道,做的时候,多自己思考,千万不要觉得自己知道思路,自己怎么写,只是情况太多,懒的写,直接看别人的答案,这样子,这道题你做了价值不大,因为这类题就是考察你思维完整性的,最好是自己做,可能你用了 十几个 if 语句,没关系。接着你可以把你的 if 语句进行化简,查找他们的共同点。最后你可以看大佬们的做法,你的收获会更大!
对了,也千万别急着动手写,应该想一想可行性,不然你容易陷入无底深渊。
对于找规律的题型也是一样,这类题最后别急着看答案,应该多思考,多做几道,做多了,你的思维会越来越灵敏,以后看到这类型的题,可以很快有思路。
所以,对于这种边界、规律题,个人感觉总结的价值不是特别大,更多的是多思考,多动手。
注意:每道题,我们都要追求最优解哈,别觉得 ac 了就完事了。
三、我看过的一些资料
上面说了那么多,可能有人是道理我都懂,可我还是学不会,说实话,学习的方法有很多,每个人的学习方法也都不一样,我这里也只是提供一种参考。但是,无论什么方法,你不去动手执行,那么,一切都是空话。这里我推荐一些我看过的书,感觉挺不错。
1、书籍推荐
刚才我说了很多种题型,对于按题型刷题总结,首推《程序员代码面试指南:IT名企算法与数据结构题目最优解》,这本书真的挺不错,大部分题型都总结了,而且每个专题有十几二十道,这里建议大家买本来学习。
还要一本我大学看的,感觉也挺不错,叫做《Java数据结构和算法.(第二版)》,不过这本比较适合不急着面试的吧,这本不像上面那一本,专门来总结各种题型应付面试。
《编程之美》、《编程珠玑》也建议看,这两本我觉得比较有趣,不是说让你一直刷题一直刷题,这两本你可以买来看看,会给你带来一些思路,这两本我是只看,没动手打代码。
Leetcode 刷题的时候,也是可以分题型刷滴,所以也可以去 leetcode 刷题,不过刷题的时候,我这里有个建议,就是别在本地 IDE 写代码,直接在网页端写就行了。因为面试的时候,一般就让你在记事本写代码,不会给你 IDE。如果你不习惯,估计很容易写错代码,而且,有些库函数你也把名字忘记了。网页端其实也是挺方便的,也会有一些代码提示。
对于,对于连各种算法思想、数据结构都还不懂的同学,上面的数据不大合适哈,推荐我看过的两本书《算法的乐趣》、《算法设计与分析基础》(这本代码实现是用伪代码的)。
2、视频推荐
说时候,我视频看的不多,对于算法的学习,特别是刷题,我是不大习惯看视频,如果你想看视频,我觉得牛客网的算法视频还不错吧,我没过几集,分初级班和进阶班。其他的我也没看过,所以这里可以推荐的不多。
四、总结
回到正题,leetcode 刷 500 道题进大厂稳吗?说实话,你能坚持刷 500 道题,说明你的能力还是挺强的,但是对于笔试,我觉得不一定稳,得看你怎么做,例如是否追求最优解,是否进行总结归纳,还是说你只是暴力 ac 了之后就不理了,或者不敢跳出舒适区,老是做那些比本来就比较擅长的题目,而遇到自己弱的题目,马上就看答案了。而且我说了,有些题是找规律或者边界很多的,这类题需要你多思考、动手,不是说我多刷几道就可以了。总之,对于刷题,千万别追求数量!
上面的做题方法,不一定适合每一个人,只是我自己的学习以及建议,供大家参考。想要获取上面那些资料的,【转发+关注】后私信我【资料】即可免费获取。