《数据科学面试40+真题讲解》,K神本年度最后一次开课


一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推你去多家公司面试
Airbnb 数据科学职位
in analytics and inference
天天打游戏、照样领工资,
你要不要来?
把贵司招聘信息放这里
查看: 7405|回复: 82
打印 上一主题 下一主题
收起左侧

[其他] 刷题进阶Tips--分享给那些有刷题经验或工作经验的人

    [复制链接] |试试Instant~ |关注本帖
跳转到指定楼层
垅头
fentoyal 发表于 2017-8-13 06:05:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货
x
本帖最后由 fentoyal 于 2017-8-13 07:37 编辑

为什么要刷题
我想大部分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个小时,不多吧?

最后
以上都是个人刷题+面试的经验的总结。适用不适用,肯定分人。因为我觉着我的智商和学校等背景状况应该是属于版上大众的水平,我觉着这些经验应该很多能适用于你。但完全照搬未必是个好主意,大家都是聪明人,看完之后,自己取舍即可。
希望大家有所收获。
祝大家刷题快乐,offer满满。



补充内容 (2017-8-30 07:06):
关于有些同学问IDE问题。一般CS科班或者多年经验的人(本帖主要受众)因为以前项目大量使用IDE,会对其依赖比较大,刷题时转白板或简单编辑器不适应。对于其他同学,level 2和3的分界线还是主要看对题目的熟练程度。

评分

30 查看全部评分

本帖被以下淘专辑推荐:

推荐
zorrowei 发表于 2017-9-6 04:57:43 | 只看该作者
楼主的分析比较全面。另外说下我刷体的一些小体会:我属于转转业来刷题的。所以白板刷题还好,没有太多障碍。自我评价,我是接近3类型的选手。(1)做LC的时候我按照算法类别做题, 每周主攻一个topic,(2)中档题目如果最多半小时内自己找不到思路,就看discussion,然后按照discussion自己写一遍。(3)每个专题的题目,先把所有题目题干过一遍,把每类型的题目分类,相似的归为一个小组,合在一起做。(4)每个专题在做题的时候把各种错误和好的思路都用文档记录下来,把重要信息都高亮显示。
回复 支持 3 反对 0 使用道具 举报
推荐
ohheylucas 发表于 2017-8-17 03:23:52 | 只看该作者
jingshihao 发表于 2017-8-17 02:58
多谢楼主的分享,非常有用的tips!

请教楼主一个问题,我在做题的过程中总觉得每一个tag都会一些,但又 ...

new grad/intern 面试都有可能被问到系统设计题, 只是概率非常小
回复 支持 0 反对 2 使用道具 举报
推荐
ICong 发表于 2017-10-22 06:52:18 | 只看该作者
fishercoder 发表于 2017-10-22 06:27
楼主总结的非常好,我在职工作快三年了,现在刷题成瘾,每天不刷一题睡不着,这是我的刷题repo:https://git ...

厉害厉害,一直在看您的博客,如果您能把hard和一些经典的medium题思路多写写,就更好了!
回复 支持 1 反对 0 使用道具 举报
推荐
stjobseeker 发表于 2017-9-4 23:32:44 | 只看该作者
freemanlax 发表于 2017-9-4 20:03
@stjobseeker 你也应该单发一个刷题的经验贴,你也满牛的!!!别谦虚!

牛倒是不牛,经验是可以分享的。
回复 支持 1 反对 0 使用道具 举报
推荐
 楼主| fentoyal 发表于 2017-9-2 05:51:21 | 只看该作者
followjason 发表于 2017-9-2 05:36
说的真好,要去面FLGU, 会做的题目一定要做到bug free。
光是会做,有一点小bug,你自己可以原谅自己,可 ...

同意,见过很多人(包括我自己),感觉都是面完FGU,感觉题都不难,自己犯了些小错,甚至自己感觉完美,结果挂了。其实所谓FGU..这类公司bar比Ms Amazon这类bar高,并不(只)是前者题目出的比后者难,而是同样难度的题,前者分数线是90分,后者是60分。
以我个人经历,真的没觉着上次面MS就比这次面Uber题目简单,两家我感觉都答了90分水平,但我U家就是挂了(我至今不知道为什么,只能理解成分数线95吧)。。MS第二天就offer了。
回复 支持 1 反对 0 使用道具 举报
推荐
Ivor761 发表于 2017-8-17 03:29:35 | 只看该作者
非常总肯。。。感觉自己 还停留在level2上。。。好绝望。level2到level3需要刷多少题?而且您说的level4到面试这个阶段看题,看的是什么题?leetcode里面如果到4级的话应该全刷过了啊。
回复 支持 1 反对 0 使用道具 举报
沙发
 楼主| fentoyal 发表于 2017-8-17 02:48:08 | 只看该作者
帖子4天才通过审核啊。。
如果大家觉着有点帮助,我可以针对某点继续展开。

评分

1 查看全部评分
回复 支持 反对 使用道具 举报
板凳
jingshihao 发表于 2017-8-17 02:58:38 | 只看该作者
本帖最后由 jingshihao 于 2017-8-17 03:03 编辑

多谢楼主的分享,非常有用的tips!

请教楼主一个问题,我在做题的过程中总觉得每一个tag都会一些,但又不是能完全hold住一个类型的题,这种情况下是应该针对每一类问题强化训练还是依靠数量积累熟练度? 谢谢!
我现在leetcode已经快刷了一遍了,感觉大部分的题看一眼都有思路,但是实际做起来又是还是会卡在某一个点上,如楼主所说的二分的边界问题。

感觉做得越多有没有自信,有点苦恼~

还有一点疑惑,new grad也需要准备系统设计题吗?
回复 支持 反对 使用道具 举报
地基
limuzi0609 发表于 2017-8-17 03:45:47 | 只看该作者
刷了200道题左右,感觉也就是每个tag大约都见了见,非常认为自己就在level 2
不过基本都是刷lc,对ide没什么依赖,遇到string确实得去搜api
很赞同楼主的那句话:你不适的感觉,就是提高的感觉。

赞!加米!
回复 支持 反对 使用道具 举报
 楼主| fentoyal 发表于 2017-8-17 03:56:25 | 只看该作者
Ivor761 发表于 2017-8-17 03:29
非常总肯。。。感觉自己 还停留在level2上。。。好绝望。level2到level3需要刷多少题?而且您说的level4到 ...

主要看以前的题,除非你记忆非常好,刷过一遍就过目不忘,否则过一遍老题,保证刷过的600道只要他敢出,你就敢秒杀。同时看看别人解法(如果你当时秒了后没看的话)。
然后可以适当看一下新题。题是刷不完的。LC刷完还有Lintcode(虽然题目差不多),还有geeksforgeeks, codeforces,实在不够刷还可以刷POJ。。而且还可以看面经里有没有新题。
回复 支持 反对 使用道具 举报
9
flyMontain 发表于 2017-8-17 03:57:01 | 只看该作者
多谢楼主的分享,看到对level4的描述,自己都不敢想象。
不知道楼主达到level4用了多长时间?
回复 支持 反对 使用道具 举报
10
 楼主| fentoyal 发表于 2017-8-17 04:03:05 | 只看该作者
jingshihao 发表于 2017-8-17 02:58
多谢楼主的分享,非常有用的tips!

请教楼主一个问题,我在做题的过程中总觉得每一个tag都会一些,但又 ...

你的情况是把算法转出代码的能力还需要提高。属于思维很好但实现需要锻炼的。
可以先针对不同题型做总结,或者看别人的总结,消化吸收别人的模板。以二分为例,总结后你甚至可以背下来哪种情况用<哪种用<=,哪种用 mid = right 还是mid = right -1 等。

评分

1 查看全部评分
回复 支持 反对 使用道具 举报
11
 楼主| fentoyal 发表于 2017-8-17 04:06:12 | 只看该作者
jingshihao 发表于 2017-8-17 02:58
多谢楼主的分享,非常有用的tips!

请教楼主一个问题,我在做题的过程中总觉得每一个tag都会一些,但又 ...

new grad建议onsite前发信问HR确认。电面我还没听说会问系统设计的,这个没法画图基本没法面。
我四年前new grad面试 on-site Google时就被问了design twitter。现在看是老掉牙的题了,但当时我真的一脸懵逼。。。完全没概念,全程被吊打。

评分

1 查看全部评分
回复 支持 反对 使用道具 举报
12
jingshihao 发表于 2017-8-17 04:12:34 | 只看该作者
fentoyal 发表于 2017-8-17 04:03
你的情况是把算法转出代码的能力还需要提高。属于思维很好但实现需要锻炼的。
可以先针对不同题型做总结 ...

受教了,非常感谢!
回复 支持 反对 使用道具 举报
13
 楼主| fentoyal 发表于 2017-8-17 04:15:19 | 只看该作者
flyMontain 发表于 2017-8-17 03:57
多谢楼主的分享,看到对level4的描述,自己都不敢想象。
不知道楼主达到level4用了多长时间?

其实Level 4没有你想的那么夸张。如果你觉着参加LC contest不会有特别大压力那就在4了。你可以找个神清气爽的一天参加一次那个LC contest(如果你已经参加了当我没说)。体验下20分钟一道且必须一次(至少是尽可能最少次)提交就AC的压力。第一次可能有点压力,但只要成功一次(名次无所谓,只要题目都做完就算成功),以后就适应了。

评分

1 查看全部评分
回复 支持 反对 使用道具 举报
14
justin 发表于 2017-8-17 06:14:42 | 只看该作者
level 4感觉基本到不了。。。
现在的水平只能到,看到所有题目基本都能想出宏观的最优解,但是一遍提交之后基本都会发现有一些边界条件和细节没有考虑到。。。个人真心觉得,一遍bug free的要么特别聪明,要么是面到了最近刚做的原题。。。
回复 支持 反对 使用道具 举报
15
gdqtfvsot 发表于 2017-8-17 08:44:59 | 只看该作者
谢谢楼主分享
回复 支持 反对 使用道具 举报
16
FightForTomo 发表于 2017-8-18 05:13:33 | 只看该作者
刷题刷题,枪在手,要啥啥有。
回复 支持 反对 使用道具 举报
17
wuyue1349 发表于 2017-8-18 05:31:15 | 只看该作者
所以刷题也可以跟狼人杀一样分阶了嘛,期待看到四阶大神
回复 支持 反对 使用道具 举报
18
dojiangv 发表于 2017-8-18 07:05:18 | 只看该作者
总结得真好!楼主真牛啊!
回复 支持 反对 使用道具 举报
19
vegito2002 发表于 2017-8-18 07:15:22 | 只看该作者
感谢一蛤, 这个文章的内容真的是太有诚意了;
回复 支持 反对 使用道具 举报
20
bumbing 发表于 2017-8-18 07:24:34 | 只看该作者
楼主总结的非常好,我觉得3的状态基本可以一直保持,
但是4的状态需要短时间内大量的练习,好多corner case其实都是刷题刷多了  凭着直觉发现的,一段时间不刷就容易写bug
回复 支持 反对 使用道具 举报
本版积分规则
关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 GMT+8, 2017-11-25 11:51
Powered by Discuz! X3 © 2001-2013 Comsenz Inc. Design By HUXTeam
快速回复 返回顶部 返回列表