从全挂到全中,我的刷题面试之路

我是18年底19年初开始刷题的,19年自己陆陆续续刷了500多道,自认为准备的差不多了,但19年下半年和2020上半年的所有大公司的面试都挂了,当时屡试屡败的感觉非常崩溃,甚至觉得自己会的很多,却怎么也面不上,不知道问题出在哪。不知道大家有没有和我之前一样的困惑。后来抱着试试看的态度找到上岸,参加了一期算法小班课的培训。

在2020年底,我参加了Apple, Google, LinkedIn, Microsoft, Waymo, Zoom的面试,没想到最后全部通过了,而且后来和几位Hiring Manager的交流中知道了我是所有Candidate里Feedback最好的,真是受宠若惊。回想这段经历感觉很不可思议,在这里希望我总结的一些方法能对正在刷题找工作的同学有所启发。

1. 表达特别重要

在参加上岸算法课的练习中,我慢慢感觉自己在刷题过程中的表达训练太少。之前都是哑巴刷题。每看到一道新题,想想写写,不会的就看答案。有时候刷一天也不会说一句话。而上岸的课特别注重让我去解释思路。有时候在课上碰到的提问,即使会的内容也不一定能解释清楚。认识到自己的弱点之后,开始特别注意这方面的提高。自己做每道题的时候,会试着去解释自己的思路,以及主动回答一些问题,比如:

  • 这个题需要做什么Clarification?
  • 这个题用Brute Force怎么解?
  • 是用什么方法可以降低时间复杂度?
  • 除了这些,还有什么别的解法?
  • 有什么有代表性的Test Case?
  • 一些Corner Case怎么去处理?

经过一段时间的练习之后,我感觉在面试中的表达更通顺了,有的面试甚至是和面试官聊天中把这道题做出来的。 在面试官提问之前,就去主动思考并且回答这些问题,会让面试官印象深刻。小王子老师经常说面试是一些面试官选同事的过程,其实很好理解:面试官也希望找一些表达清楚,幽默风趣,思维敏捷的同事共事,而不是一些靠死记硬背面试,或者连最基本的算法都解释不明白的人。

2. 与其去押题,不如提高基础

之前在刷题的时候,会把全部精力放在押题上。比如说面X公司之前,我就会做LC上这个公司的Tag,有的甚至做2,3遍,还去一亩上面找别人的面经。但是很不幸,之前面试中总会碰到“意外”,比如突然碰到一道新题,或者面试官要求用我没准备的方法去解这道题。 每次遇到这种情况我就开始慌,心理一直想这个怎么没准备到?怎么面试官在针对我bla bla bla? 这种情况自然会挂。

后来也发现,有些公司的题库很不固定,比如A或者G家,LC上就有400多道,自己准备面试的时间很短,尤其是需要同时准备好几个公司的时候,根本准备不到所有的题。还有的公司会鼓励选新题来面,刷多少也不一定能碰到见过的,刷的太多碰到见过的也不一定记得住。**这时候与其去赌押题的概率,不如把精力用在提高基础上。基础好了,才能应对常见各种情况。**我后来只刷一些高频,并且少刷点新题,把主要精力还是用来一遍遍过最基本的Topic,把基础打的特别扎实才会应对各种意外情况。到最后发现,其实面的并不难,而是之前基础没打好而已。

3. 知道什么该刷,更应该知道什么不该刷

大家都是在校或者在职刷题,时间有限。想短时间通过面试,刷题的效率尤其重要。其实真正的难题不多,大多数还是Easy和Medium,这有几个原因:

  • 面试时间有限,有的Hard太长,Candidate写不完,写完也是背的,考这个没意义
  • Hard题面试官要花更长时间准备,有的时候他们很忙,没时间准备那么多 (真心话)
  • Hard题时间只允许考1道,如果考Medium可以考两道,比如说考个Tree考个String什么的,这样能考察更多的知识点。
  • 面试更注重考察Candidate的思考和讲解过程,他们也希望Candidate花一定时间在这上面
  • 大家都是和别的Candidate竞争,如果考的太难,谁都不会,面试官自然不会拿这种题考

我的意思并不是不刷Hard,而且不应该着重刷Hard,很多高频的Hard还是蛮有意义的。有时候准备一道Hard的时间可以准备3,4道Medium,哪个更有效率不言而喻。

还有,很多Topic真的考的几率很少,比如Bit Manipulation,比如DP (真心话,据我所知有几个公司是不问DP的)。这时候不如把精力放在更容易被问到的Topic,比如Tree, BFS, Sliding Window, Sweepline等等。

4. 心态很重要

我之前面试的时候如果有一轮卡住了心态容易蹦,尤其是前两轮如果碰到哪里不顺,后面几轮会注意力无法集中。后来经过练习,我如果碰到自己不会的地方,会更注重展示自己会的点。有的时候并不是每一个Follow Up都会想到怎么解,这时候面试官看的更是你有没有把能做出来的部分做好。

还有如果真的碰到不会的题,尽量和面试官把解法聊出来,如果实在不行,早点缴枪投降,让面试官换一个题,也不至于死的太难看。而不是看着一个题沉默30分钟。

我知道,大家刷题找工作的时候都是很焦虑,这时候更应该注重休息,劳逸结合,这样面试时候才会有很好的发挥。一次面试经常会连续5,6个小时输出,对体力要求很高。这时候应该注意放松心态,并且利用好面试间隔补充体力。

5. 刷题不是看量,而是看理解

经常听到很多人以刷题的数量来衡量水平。比如说,有人刷了800道,就是大神,有人刷了300,就是弱鸡。但我可以明确的告诉你,这个数字没有任何意义。我认识很多G家的朋友,一共刷了200道左右,众说周知G家面试算难的,但是他们却都通过了。其实真正拼的是对题的理解,而不是做了多少题。仔细想想,你做完一道题之后,可不可以:

  • 自己把思路讲明白
  • 想一些Test Case
  • 把这道题归纳总结,并且联系之前做过类似的题
  • 把这类题的模版总结出来

这时候,在每道题的时间会花费更多,也会更有收获。比如你刷到一道Union Find的题,能不能想到为什么用Union Find来解,BFS或者DFS行不行?UF的时间复杂度是多少?UF有什么优化?(比如weighted UF, path compression)别的UF题和这个题有什么不一样?如果你这些都讲过一遍,你对UF的理解会比盲目的增加刷题量强多了,因为盲目刷题不一定能记得住,也不一定能从新题中学到东西。

其实要通过一般难度的面试,精刷200到400道足以。不求更多数量,而是从每一道题里学到做题的方法,才会事半功倍。

6. 如果碰到5轮面试官都是三哥三姐,直接reschedule。。

不解释

7. 注意BQ:

重要的事情说三遍:BQ非常重要,BQ非常重要,BQ非常重要。很多公司现在特别政治正确,希望大家多花时间研究这个公司的Principle,BQ需要答什么点,怎么去扣题,并且怎么联系到自己之前的Project。

中国人的表达本来就不占优势,天生都很含蓄,这是在BQ中很吃亏的。如果觉得自己答的不好,一定要专门花时间去练。我是找的上岸的洛音老师帮我过了一遍怎么去答这些BQ题,尤其是怎么联系到自己之前做过的Project。有些公司会在写算法题之前问10到30分钟的BQ,如果BQ答的不好,也会影响到后面做题。如果前面答的顺,会让后面更有自信一些。

这就是我总结在刷题面试过程中值得注意的点,希望能帮助到大家。非常感谢上岸和小王子老师一直以来给我的帮助。一直觉得刷题是一个修行的过程。也可以算是投入产出比最高的学习过程。毕竟每人从小到大上过无数个课外班,无数个晚自习,而真正能学完之后能让自己工资提高的几乎没有。我有很多朋友慢慢的把刷题变成了一个业余活动,毕竟以后跳槽还用的着。可能刷题真的是一辈子的事情哈哈。

最后帮小王子老师介绍一下他1月份主讲的算法公开课,附上课程安排时间表,1个月的课程完全免费。上岸有很多免费的公益带刷课程还是值得大家去上上的,老师输出的干货巨多。秉着花钱花在刀刃上的原则,死板的知识点类型的课程真的没必要花钱去学。

希望大家都拿到自己心仪的Offer。