转载:刷题各个阶段的意义+Tips

为什么要刷题?
我想大部分new grad对这个问题没有任何疑惑。但对于已经有很多年工作经验的人,这个问题是一个必须想明白的问题。否则会极大的影响自己刷题的motivation.一边刷,一边愤恨道:我N年的经验根本不看,就考这些破算法题?你们谁工作用过这么复杂的算法?报着这个心理刷题,能刷成啥样可想而知。
做题和工作经验的关系,可以类比成下面这个问题:

“男人看女人,到底是更看重外貌还是思想?”
答:思想决定我会不会和她交往,而外貌决定我愿不愿意了解她的思想!

交往=雇佣, 男人=公司,女人=你,外貌=做题,思想=工作经验,一目了然了吧?
考做题是对一个程序员基本素养的考核,如果这个不达标,你的经验再多公司也不会要你。就比如你去面试国足,你说你踢了10年球了。人家先测你个百米速度,你跑了半分钟,那你踢几年球有意义吗,只能说明你在低水平球队混了10年而已。
但一旦你刷题这关过了,all of sudden,your experience starts to matter! 一个top university ms new grad, 就算题目都秒,他也拿不了Google T5. 但一个10年经验的,题目秒的慢了点,也可以轻松拿T5. 所以工作经验非常重要,但刷题也是非常科学的招人指标。

要刷到什么水平?
版上大家很爱问一个问题,到底刷到什么水平能拿offer。我试着以我的理解来回答下这个问题。单说以找工作为目标的刷题,我把刷题分为4个阶段:
1. 不知道怎么刷题,对很多概念比如Big O, DP都陌生。每天纠结到底是看那个算法书/资料入门快。
2. 在一个良好的IDE里,做Medium题目只要愿意想一般都能做出来,做不出来看答案也就懂了。Hard也能做出不少。除了有些复杂算法还在消化中,算法上基本已经入门。但脱离IDE写代码,就有点发怵。函数signature甚至函数名都老记错。搞个string操作还得Google一下API。非常依赖自动补全。很多新人以及多年经验的老人,可能都处于这个阶段。
3. 除了偶尔遇到个Hard题得想很久,基本平时刷LC非常comfortable。同时能非常comfortable的在白板或者LC等网站的网页简单IDE里写代码。写代码过程中不需要Google函数用法。不依赖自动补全。而且甚至觉着这么写比在IDE里还舒服。
4. 在3的基础上,一般题目都是20分钟一道,写完基本扫一下一检查就可以bug-free。Hard题噼里啪啦码一堆,不管逻辑再混乱,心里非常清楚自己码的是什么,复杂度多少,有没有优化潜力。且非常自信自己码的是对的。对于一次提交就AC是自己的基本要求。对参加LC contest(contest里都要求一次提交就AC,否则罚时)等业余竞赛比较comfortable。

以我理解:
刷到3就可以去面试了。较大概率拿下Amazon MS等二线公司offer。
刷到4去面一线公司(FLGUAirPS…),基本也有较大概率成功。
当然因为这种问题本来就不会有真理解,我的回答仅供参考。

怎么刷题?
今天谈的是进阶刷题tips,所以不谈1到2的过程,虽然这个过程是一个非常重要的质的飞跃。今天主要谈2, 3如何到4 和 4以后如何准备最终的面试。
2到3:
2到3是比较容易的,这个就是强迫自己在白板或者notepad这种文本编辑器里写代码,练多了就适应了。但头几次肯定会老去翻API什么的。但是人只有在被pushed out of your comfortable zone,才能提高。你不适的感觉,就是提高的感觉。

3到4:
这里就需要提高自己的要求。当你觉着AC一题不是很难的事情时,将要求提高到一次提交必须AC。最好是编译错误都不要有,甚至连调试都不调试,甚至连人脑检查都不检查。终极状态就是噼里啪啦敲完一道题二话不说直接点submit,然后就AC 。这个要求确实太夸张,我自己也做不到(做到几次也是纯运气)。但这个要求其实合理:当你面试时,你在白板上写,写完之后,面试官很可能就立刻开始给你指bug了,你这时有的bug,都算bug!这里有一个面试技巧,面试时,在写完最后一句话前,最好做个大停顿,过一下之前写的,快速检查下。当然你嘴上可以给面试官解释你现在是在做最终检查,不是说卡住不会了。
提高要求后,就是强迫自己每题达到要求。脑子里一定要认为,只有一次提交AC才算过,否则这题就算挂了。这又一次把自己从comfortable zone里push出来。但仍然那句话,你不适的感觉,就是提高的感觉。当然更高要求自己只是第一步。更要讲究方法。所以还是要学会总结。我曾经花过一整天时间总结二分查找。关键是+1 -1,上限,下限如何处理。这个总结完之后,再遇到二分题,最代码质量明显提高,随之而来的一个必然提升就是自己对二分题目的信心。以前见到二分特别闹心,生怕自己犯上下限+1 -1错误。现在再见二分都是长舒一口气,送分题来了!
按这个要求刷100道题,coding的提高是可以感觉到的。有些很复杂的逻辑,以前写完觉着肯定会有bug的,现在就会很惊讶的发现居然写完就是对的。一次两次以为自己运气好,之后就会明白可能是自己水平真的提高了。

4到面试。
到4的同学,基本属于刷题刷的很好的了,直接去面一线公司,大概率可能都能过,但为了保险,做到双杀,N杀,甚至All kill来增加自己offer谈判筹码,还可以再做一些强化:
面试前一两周要做的就是,看题。就是只看题目,想解法,但不用写。
题分两种,一种是考思维的题(比如很多贪心,你能想到如何去贪心,代码就几行)。还有一种是考实现的,(比如链表指针操作的题)。两种都考的归到考实现的那类。对于考思维的题,看5道10道动手做一道,确定自己水平没问题,保持下手感即可。对于考实现的题,最好尽量都再做一遍。那你问为啥不所有题都再做一遍?因为时间不够啊,最后两周,你要么选择刷几十道题,要么选择看几百道题(+刷若干题保持手感),这种情况选后者(别忘了你已经在4这个阶段了,对自己coding水平应该不存在怀疑了)。看题的一个原因是追求coverage,refresh下以前刷题的记忆,增大面试碰原题几率。而更重要的目的是,看题一定要看别人的解法,然后准备几个不同的解法。总之就是一题多解:
- 一定要知道 这题“标准解法”是什么。这个可以看LC Discuss里top voted那些或者其它相关文章。这个可能比你当时刷题的解法好,也可能烂。但你要知道。有些面试官他出题前,他脑海里有个标准做法。你的方法如果很与众不同,交流起来会很费劲,明明标准解法10分钟就能写清讲清,你的nb解法要花30分钟才能把他搞懂。你这轮本来能做3题,现在做2题。而且面试官可能对你的办法依然将信将疑,甚至觉着有问题。我个人教训就是以前面亚麻,明明很简单的一道题, 我平时刷都是10分钟秒杀的。面试那天那个面试官智商捉急(当然他可能觉着我表达捉急),硬是一直说不懂我的做法为啥是对的。。。最后折腾了30分钟,他说你别用你做法了,我提示个你做,我心想凭什么啊,很抵触的去follow他的提示,结果我也听不懂他在说啥。。然后结果可想而知。回来扫了眼LC,发现他提示的就是大家标准做法。而我的做法很小众。
- 一定要知道一个interview-friendly的解法。你刷题的解法或者标准解可能都不是你能在面试45分钟内写出来的。知道一个实现简单,思路更直白更好记的interview-friendly解很重要。刷题时一定要脑子里蹦根弦,想想你现在写的代码你面试时45分钟能不能bug free写出来?如果不能,找一个能的做为此题的面试解。举个例子,你做LC Reverse Pairs可能是用自己实现一个特殊的BST做的。但它也可以用merge-sort思路实现。那你面试一定要用后者。你如果当时刷过了,不回头看一下别人的做法,面试时真去自己实现BST去了,那很可能就挂在实现BST的增删查改上了。
- 锦上添花的话,考虑准备一个表演解。就是这个解与众不同,而且也是interview-friendly并且能当场讲清楚的。目的就是impress的面试官。同时让他觉着你没见过这题,临时想的。一个例子就是Deserialize/Serializetree。这个自由度很高,你可以用一个与众不同但也很简单清晰的做法来让面试官眼前一亮。

怎么对付非算法题?
因为本帖主要针对有工作经验的。我们的面试基本都会由系统设计或者多线程这类非算法问题。当然BQ也可以归为这一类。我以前面试挂在过这类问题上。
后来如何解决的呢?道理很简单,就是重!视!起!来!
我想可能对于很多和我一样的人,都是宁可去写5道算法题,也不愿去抠一个系统设计/多线程题。但同样道理,push yourself out of your comfortable zone。逼着自己去抠,去学那些问题。那些题其实比算法好上手的多,只要你愿意去花时间查资料,研究思路,做总结。
按我两年前的一次面试为例,我花在刷题上时间有几百小时,但花在系统设计/多线程等问题的时间加起来不到10个小时。。而我更听说有人BQ就花10分钟准备就去面试了,然后果断挂在BQ上了。。解决方法就是对这些问题重视起来。按照面试3道coding一道系统设计比例,给系统设计分配你刷题时间的1/5不多吧? BQ分配3个小时,不多吧?

你可能感兴趣的:(cheerleader)