【笔试篇】LeetCode刷题500+道,笔试稳不稳?
前面我们已经讲解了技术岗的笔试大致情况,并且说了笔试主要以编程题为主,那么这一节,主要就是跟大家讲一讲笔试编程题的难度有多难,让大家心里有个认知。
在面试的时候,我们一般用 LeetCode 的刷题量来权衡你的面试算法寿手撕,比如把 LeetCode 常见的一两百道题刷一两遍,可能面试就稳了。
那对于笔试,如果我们 LeetCode 刷个 500+ 道题,笔试稳不稳呢?
答案是:非常不稳。
下面跟大家说一说笔试编程题考察的类型以及笔试的题为啥会这么难。
一、笔试编程题的特点
在刷 Leetcode 的时候,你会发现,每道题的题目描述都很短,你只需要花十几秒的时间,就知道这道题是要你干嘛了,并且每道题所用到的算法思想都很明确,比如动态规划、递归、二分查找等等,你可能很快就知道该用哪种方法。
而在笔试中则完全不一样,在笔试中,大部分题目都是情景题,可能读懂题目都需要花不少时间,偶尔还会遇到不知道题目要我们干嘛的情况,而且有时间限制,估计每道题给你分配的时间是 30 分钟。
这里我随便扔一道题给大家感受一下(Shopee 笔试真题)
我一开始,都看不大懂题目,或者要理解好些时间,并且你不容易看出来,这些道题该用什么方法好,有可能是多种方法的结合(当然,不是指这道题哈)。
也就是说,在 LeetCode 中,hard 级别的题做得出来,而在笔试中,medium 级别的题,由于时间、心态等因素的影响,你可能还做不出来,所以会让你觉得笔试的题特别难,但是呢,当你看了答案之后,好像又没有那么难。
所以呢,笔试题之所以很难,原因就是灵活 + 新 + 以情景的模式来给出问题。
二、笔试题型总结
在笔试中,一般是考察如下题型,如果你能够把这些题型都运用熟悉,那么你做笔试题,临时变通能力将会好很多:
1、基本数据结构的考察:这类题我觉得是比较简单的,主要考场基本数据结构的操作,例如二叉树的层序遍历,链表的逆序等,当然,它不会直接告诉你,让你来逆序或者遍历,不过这种题型花点时间一般能做出来。例如
2、某种算法思想的掌握:这类题你掌握了某种算法思想,就会比较容易,如果不懂,那就凉凉了。例如动态规划、回溯、枚举、深度/广度、贪心、二分等。
其中,我觉得动态规划考的挺多,还有就是 回溯+深度/广度。例如
所以,常见算法思想,一定要掌握,特别是回溯大法,万物皆可回溯暴力求解,虽然无法 100% 通过,但是可以拿到一些基本分。
3、边界条件的考察:这类型的题,估计你一看就有思路,知道该怎么做,但是,它的边界条件特别多,需要分很多种情况来讨论,特别特别容易出错,有时候会让人陷进去,越做越复杂,这类题主要考场你的思维严谨程度。例如
4、找规律、数学公式:这类型的题,主要是根据数据之间的一些关系,来找一些规律,进而推出他们的通用公式,就像我们高中时,找数列的同项一样。例如
以上几种便是常见的题型,无论是哪一种,要 100% 通过,都没有那么容易,会有很多陷阱,把握不好会一直把你卡死,所以大家在做笔试题的时候,如果三四十分还做不出来,一定要及时止损,抓紧去做其他题。
因为很多题,要 100% 的测试案例通过不容易,但是要通过百分之二三十,还是不难,而通过了百分之二三十,也是能够拿到百分之二三十的分数都。
二、应该如何刷题?如何学习?
上面说了笔试题的一些情况,也说了主要考察的一些题型,那么我们在刷题的时候,针对这些题型,你要做好下面几件事,避免出现只是堆数量的无效刷题。
1、分类归纳/总结
归纳?总结?估计大部分都知道归纳、总结这么一回事,但是,有没有去实践我就不知道了,比如下面便是常见的题型:
(1)、数组和相关题型
对于算法题,还是有很多种题型需要去总结的,如果你懂这个题型,以后遇到类似的题,相信很快就能做出来的,有哪些题型可以总结呢?
答是非常多:例如
(1)、给你一个非负数的数组,求最大子数组和的长度
这算是一个题型,关于这个题型,有很多种变形、拓展,这里建议一起归纳总结,例如
(2)、刚才给的数组是非负数的,现在变一下,给的数组是可正可负。
还能继续拓展吗?答是可以的,例如
(3)、给你个矩阵(即二维数组),求最大子矩阵和的面积
还有吗?有,例如刚才是求最大和,现在我改成求最大乘积。
我举上面这些例子,就是想告诉你,对于前期的学习,我建议分类刷题,总结题型,像我上面举的这些例子,在笔试/面试中还是比较常见的,如果你懂得对应的方法,就可以秒杀了。
例如我刚才举例的 Shopee的零食柜 那道题,实际上就是数组切割题型,相当于给你一个数组,让你切割 n 下,那么可以把数组切割成 n + 1 个子数组,问题就是:该怎么样切割,才能让最大子数组的和最小?
关于题型总结,还是很多的,我这里无法一一给你列举,只能靠你在平时刷题的过程中,进行分类、总结。
下面我在多说一些题型吧,你感兴趣也可以去总结起来
(2)、基本数据结构操作相关题型
刚才我说了,笔试题的考察,有一类题是基本数据结构的考察,而且,这类题在面试中,也是高频考点,当然,在笔试中并非高频点。
对于这类题,我觉得你如果愿意去总结,以后遇到,就可以轻松拿下了。例如
链表的各种操作:逆序、部分逆序、按某种条件逆序;判断是否有环、环的入口节点、删除指定节点等。
二叉树的各种操作:各种非递归的遍历操作(前中后、层)、二叉树的公共祖先、根据前中后的遍历结果来重构二叉树等等。
队列、栈相关操作:最小栈、来队列来实现栈等。
(3)、字符串相关问题
不得不说,字符串相关问题,估计考的最高频,而且,我可以告诉你,对于字符串相关问题,90% 可以用动态规划来解决。
反正对于字符串问题,我第一想法就是考虑能否套用动态规划,字符串题型点多,如果你有时间,建议总结,例如:通配符的匹配、最长公共子串、最小编辑代价、最长回文串等等。
大部分都是用动态规划,而且,我觉得解法都差不多,所以强烈建议专门花一段时间来做、总结、归纳。
2、多思考/动手,提高自己的思维完整性/灵敏性
(1)、边界、找规律题型
刚才我说有一类题型是边界特别多的,对于这类题,我觉得不好总结,这类题考察你逻辑是否严谨,能否化繁为简。
这里我建议多做几道,做的时候,多自己思考,千万不要觉得自己知道思路,知道怎么写,但是由于临界点太多,导致懒的写,转而直接看别人的答案。
如果这样子的话,这道题你就白做了,因为这类题就是考察你思维完整性的,所以最好是自己动手去做,哪怕你用了 十几个 if 语句,也没关系。接着你可以把你的 if 语句进行化简,查找他们的共同点,等等。最后你可以看大佬们的做法,你的收获会更大!
对了,也千万别急着动手写,应该想一想可行性,不然你容易陷入无底深渊。
对于找规律的题型也是一样,这类题最后别急着看答案,应该多思考,多做几道,做多了,你的思维会越来越灵敏,以后看到这类型的题,可以很快有思路。
所以,对于这种边界、规律题,个人感觉总结的价值不是特别大,更多的是多思考,多动手。
三、总结
最后回到标题,LeetCode 刷 500 道题稳吗?说实话,你能坚持刷 500 道题,说明你的能力还是挺强的,但是对于笔试,我觉得不一定稳,得看你怎么做,例如是否追求最优解,是否进行总结归纳,还是说你只是暴力 ac 了之后就不理了,或者不敢跳出舒适区,老是做那些比本来就比较擅长的题目,而遇到自己弱的题目,马上就看答案了。
而且我说了,有些题是找规律或者边界很多的,这类题需要你多思考、动手,不是说我多刷几道就可以了。
总之,对于刷题,千万别追求数量!
花个一年的时间去梳理总体这些题,那么无论是面试还是笔试,算法都是没问题的了,就算你可能无法在笔试中做出高分,那整个及格分还是问题不大!