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