想要学习算法, 应付笔试或者应付面试手撕算法题, 相信大部分人都会去刷 Leetcode, 有读者问? 如果我在 leetcode 坚持刷它个 500 道题, 以后笔试 / 面试稳吗?
这里我说下我的个人看法, 我认为不稳. 下面说说为啥不稳以及算法题应该如何刷, 如何学才比较好, 当然, 也会推荐自己学过的资料.
一, 先说说笔试题
在刷 leetcode 的时候, 你会发现, 每道题的题意都很短, 你只需要花十几秒的时间, 就知道这道题是要你干嘛了, 并且每道题所用道的算法思想都很明确, 动态规划, 递归, 二分查找等, 你可能很快就知道该用哪种方法, 只是你不懂如何把代码写出来而已.
而在笔试中是完全不一样的, 在笔试中, 大部分题目都是情景题, 可能读懂个题目都需要花不少时间, 偶尔还会遇到不大知道题目要我们干嘛, 而且有时间限制, 估计每道题给你分配的时间是 30 分钟. 这里我随便扔一道题给大家看看 (Shopee 去年的真题)
并且你可能不容易看出来, 这些道题该用什么方法好, 有可能是多种方法的结合 (当然, 不是指这道题哈).
也就是说, 在 leetcode 中, hard 级别的题做的出来, 而在笔试中 medium 级别的, 由于时间, 心态等因素的影响. 你可能还做不出来, 当然, 大佬除外. 下面说一说题型的一些题型以及如何学习算法会好应付点.
在笔试中, 我认为主要有如下几种题型:
1, 基本数据结构的考察: 这类题我觉得是比较简单的, 主要考场基本数据结构的操作, 例如二叉树的层序遍历, 链表的逆序等, 当然, 它不会直接告诉你, 让你来逆序或者遍历. 例如
2, 某种算法思想的掌握: 这类题你掌握了某种算法思想, 就会比较容易, 如果不懂, 那就凉凉了. 例如动态规划, 回溯, 枚举, 深度 / 广度, 贪心, 二分等. 其中, 我觉得动态规划考的挺多, 还要就是 回溯 + 深度 / 广度. 例如
所以, 常见算法思想, 一定要掌握.
3, 边界条件的考察: 这类型的题, 估计你一看就有思路, 知道该怎么做, 但是, 它的边界条件特别多, 需要分很多种情况来讨论, 特别容易出错, 有时候会让人陷进去, 越做越复杂, 这类题主要考场你的思维严谨程度. 例如
4, 找规律, 数学公式: 这类型的题, 主要是根据数据之间的一些关系, 来找一些规律, 进而推出他们的通用公式, 就像我们高中时, 找数列的同项一样. 例如
二, 应该如何刷题? 如何学习?
上面说了笔试题的一些情况, 也说了主要考察的一些题型. 针对这些题型, 我觉得在刷题的时候, 你要做好下面几件事.
1, 分类归纳 / 总结
归纳? 总结? 估计大部分都知道归纳, 总结这么一回事, 但是, 有没有去实践我就不知道了.
(1), 数组和相关题型
对于算法题, 还是有很多种题型需要去总结的, 如果你懂这个题型, 以后遇到类似的题, 相信很快就能做出来的. 有哪些题型可以总结呢? 答是非常多: 例如
(1), 给你一个非负数的数组, 求最大子数组和的长度
这算是一个题型, 关于这个题型, 有很多种变形, 拓展, 这里建议一起归纳总结, 例如
(2), 刚才给的数组是非负数的, 现在变一下, 给的数组是可正可负.
还能继续拓展吗? 答是可以的, 例如
(3), 给你个矩阵 (即二维数组), 求最大子矩阵和的面积
还有吗? 有, 例如刚才是求最大和, 现在我改成求最大乘积.
我举上面这些例子, 就是想告诉你, 对于前期的学习, 我建议分类刷题, 总结题型, 像我上面举的这些例子, 在笔试 / 面试中还是比较常见的, 如果你懂得对应的方法, 就可以秒杀了, 因为这类题, 没啥边界或者规律. 例如我刚才距离的 Shopee 的零食柜那道题, 实际上就是数组切割题型, 相当于给你一个数组, 让你切割 n 下, 那么可以把数组切割成 n + 1 个子数组, 怎么样切割, 才能让最大子数组的和最小?
关于题型的, 还是很多的, 我这里无法一一给你列举, 只能靠你刷题的过程中, 进行分类, 总结. 不过我可以给你推荐一些资料, 后面推荐哈. 下面我在说一些题型吧.
(2), 基本数据结构操作相关题型
刚才我说了, 笔试题的考察, 有一类题是基本数据结构的考场, 而且, 这类题在面试中, 也是高频考点, 在笔试中, 倒不是很高频. 对于这类题, 我觉得你愿意去总结, 那么以后遇到, 问题不大. 例如
链表的各种操作: 逆序 (部分逆序, 按某种条件逆序), 判断是否有环, 环的入口节点, 删除指定节点等.
二叉树的各种操作: 各种非递归的遍历操作 (前中后, 层), 二叉树的公共祖先, 根据前中后的遍历结果来重构二叉树等等.
队列, 栈相关操作: 最小栈, 来队列来实现栈等.
(3), 字符串相关问题
不得不说, 字符串相关问题, 估计考的最高频, 而且, 我可以告诉你, 对于字符串相关问题, 90% 可以用动态规划来解决. 反正对于字符串问题, 我一般想法就是能否套用动态规划, 字符串问题有点多, 不过你有时间, 建议总结. 例如: 通配符的匹配, 最长公共子串, 最小编辑代价, 最长回文串等等. 大部分都是用动态规划, 而且, 我觉得解法都差不多, 所以强烈建议专门花一段时间来做, 总结, 归纳. 后面我也会写这方面的算法文章, 敬请期待.
2, 多思考 / 动手, 提高自己的思维完整性 / 灵敏性
(1), 边界, 找规律题型
刚才我说有一类题型是边界特别多的, 对于这类题, 我觉得不好总结, 这类题考察你逻辑是否严谨, 能否化繁为简. 这里我建议多做几道, 做的时候, 多自己思考, 千万不要觉得自己知道思路, 自己怎么写, 只是情况太多, 懒的写, 直接看别人的答案, 这样子, 这道题你做了价值不大, 因为这类题就是考察你思维完整性的, 最好是自己做, 可能你用了 十几个 if 语句, 没关系. 接着你可以把你的 if 语句进行化简, 查找他们的共同点. 最后你可以看大佬们的做法, 你的收获会更大!
对了, 也千万别急着动手写, 应该想一想可行性, 不然你容易陷入无底深渊.
对于找规律的题型也是一样, 这类题最后别急着看答案, 应该多思考, 多做几道, 做多了, 你的思维会越来越灵敏, 以后看到这类型的题, 可以很快有思路.
所以, 对于这种边界, 规律题, 个人感觉总结的价值不是特别大, 更多的是多思考, 多动手.
注意: 每道题, 我们都要追求最优解哈, 别觉得 ac 了就完事了.
三, 我看过的一些资料
上面说了那么多, 可能有人是道理我都懂, 可我还是学不会, 说实话, 学习的方法有很多, 每个人的学习方法也都不一样, 我这里也只是提供一种参考. 但是, 无论什么方法, 你不去动手执行, 那么, 一切都是空话.
这里我推荐一些我看过的书, 感觉挺不错.
文中涉及到的书籍以及视频, 在我的微信公众号: 苦逼的码农, 回复『算法学习』即可获取
1, 书籍推荐
刚才我说了很多种题型, 对于按题型刷题总结, 首推《程序员代码面试指南: IT 名企算法与数据结构题目最优解》, 这本书真的挺不错, 大部分题型都总结了, 而且每个专题有十几二十道, 这里建议大家买本来学习.
还要一本我大一看的, 感觉也挺不错, 叫做《挑战程序设计大赛》, 不过这本比较适合不急着面试的吧, 这本不像上面那一本, 专门来总结各种题型应付面试.
《编程之美》,《编程珠玑》也建议看, 这两本我觉得比较有趣, 不是说让你一直刷题一直刷题, 这两本你可以买来看看, 会给你带来一些思路, 这两本我是只看, 没动手打代码.
Leetcode 刷题的时候, 也是可以分题型刷滴, 所以也可以去 leetcode 刷题, 不过刷题的时候, 我这里有个建议, 就是别在本地 IDE 写代码, 直接在网页端写就行了. 因为面试的时候, 一般就让你在记事本写代码, 不会给你 IDE. 如果你不习惯, 估计很容易写错代码, 而且, 有些库函数你也把名字忘记了. 网页端其实也是挺方便的, 也会有一些代码提示.
对于, 对于连各种算法思想, 数据结构都还不懂的同学, 上面的数据不大合适哈, 推荐我看过的两本书《数据结构与算法分析 - C 语言描述版》,《算法设计与分析基础》(这本代码实现是用伪代码的).
2, 视频推荐
说时候, 我视频看的不多, 对于算法的学习, 特别是刷题, 我是不大习惯看视频, 如果你想看视频, 我觉得牛客网的算法视频还不错吧, 我没过几集, 分初级班和进阶班. 其他的我也没看过, 所以这里可以推荐的不多.
四, 总结
回到标题, leetcode 刷 500 道题稳吗? 说实话, 你能坚持刷 500 道题, 说明你的能力还是挺强的, 但是对于笔试, 我觉得不一定稳, 得看你怎么做, 例如是否追求最优解, 是否进行总结归纳, 还是说你只是暴力 ac 了之后就不理了, 或者不敢跳出舒适区, 老是做那些比本来就比较擅长的题目, 而遇到自己弱的题目, 马上就看答案了. 而且我说了, 有些题是找规律或者边界很多的, 这类题需要你多思考, 动手, 不是说我多刷几道就可以了.
总之, 对于刷题, 千万别追求数量!
上面的做题方法, 不一定适合每一个人, 只是我自己的学习以及建议, 供大家参考. 想要获取上面那些资料的, 可以在我的公众号 苦逼的码农 回复『算法学习』即可获取.
今天是国庆最后一天, 大家也玩够了, 所以接下来, 就要好好学习了, 先把自己的硬实力提升起来. 在后面, 我也会多写一些算法题, 例如动态规划, 回溯, 递归等.
看完有收获? 那么希望老铁别吝啬你的三连击哦
1, 点赞, 可以让更多的人看到这篇文章
2, 关注我的原创微信公众号『苦逼的码农』, 第一时间阅读我的文章. 公众号后台回复『电子书』, 还送你一份电子书大礼包哦.
3, 也欢迎关注我的博客哦.
作者简洁
作者: 帅地, 一位热爱, 认真写作的小伙, 目前维护原创公众号:『苦逼的码农』, 以写了 150 多篇文章, 专注于写 算法, 计算机基础知识等提升你内功的文章, 期待你的关注.
来源: https://www.cnblogs.com/kubidemanong/p/11751233.html