一亩三分地

 找回密码 注册账号

扫描二维码登录本站

BBS
Offer多多
Salarytics
交友
Learn
Who's Hiring?
疫情动态
指尖新闻
Instant
客户端
微信公众号
扫码关注公众号
留学申请公众号
扫码关注留学申请公众号
Youtube频道
留学博客
关于我们
查看: 53577|回复: 159
收起左侧

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

    [复制链接] |只看干货 |刷题
我的人缘0

升级   5.13%


分享帖子到朋友圈
fentoyal | 显示全部楼层 |阅读模式
本楼: 👍   100% (37)
 
 
0% (0)   👎
全局: 👍   94% (731)
 
 
5% (41)    👎

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

您需要 登录 才可以下载或查看,没有帐号?注册账号

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的分界线还是主要看对题目的熟练程度。

补充内容 (2019-10-14 07:46):

关于有些同学问如何谈包裹, 我也另开一篇, 写了心得总结,抛砖引玉.祝大家拿到满意包裹. https://www.1point3acres.com/bbs ... read&tid=559735

补充内容 (2019-10-14 07:47):
修复链接..
https://www.1point3acres.com/bbs ... read&tid=559735

评分

参与人数 116大米 +353 收起 理由
BobbyBear + 2 很有用的信息!
huo2020 + 1 很有用的信息!
dylansun + 1 赞一个
asa11 + 1 很有用的信息!
alan_liu + 2 给你点个赞!
zoefei + 2 给你点个赞!
zry1993 + 1 棒!
weii + 1 很有用的信息!
robinsnowy + 1 很有用的信息!
瓜皮皮 + 1 给你点个赞!

查看全部评分


上一篇:Erect the fence是个典型的凸包问题。。狗这是要往ACM的方向杀过去了么。。
下一篇:分享一些我的 Javascript ( ES6 ) 解法

本帖被以下淘专辑推荐:

我的人缘0

升级   17.08%

zorrowei 2017-9-6 04:57:43 | 显示全部楼层
本楼: 👍   100% (12)
 
 
0% (0)   👎
全局: 👍   93% (138)
 
 
6% (9)    👎
楼主的分析比较全面。另外说下我刷体的一些小体会:我属于转转业来刷题的。所以白板刷题还好,没有太多障碍。自我评价,我是接近3类型的选手。(1)做LC的时候我按照算法类别做题, 每周主攻一个topic,(2)中档题目如果最多半小时内自己找不到思路,就看discussion,然后按照discussion自己写一遍。(3)每个专题的题目,先把所有题目题干过一遍,把每类型的题目分类,相似的归为一个小组,合在一起做。(4)每个专题在做题的时候把各种错误和好的思路都用文档记录下来,把重要信息都高亮显示。

评分

参与人数 3大米 +3 收起 理由
getDone1 + 1
阿东童鞋 + 1 赞一个
Sujievic + 1 赞一个

查看全部评分

回复

使用道具 举报

我的人缘0

升级   5.13%

 楼主| fentoyal 2019-5-15 01:07:58 | 显示全部楼层
本楼: 👍   100% (3)
 
 
0% (0)   👎
全局: 👍   94% (731)
 
 
5% (41)    👎
kuboy 发表于 2019-5-5 10:51
额,什么策略?翻了楼主其他的主题帖也没找到

没什么策略了,就是有次和他聊天说hard题最后好多没做完心虚怎么办,我说我刷的时候是优先刷hard的,因为中等题很多可以抽个1个小时半个小时空闲就刷两道,hard题一般得周末找个整块时间。所以我一般整块时间都是刷hard,medium留着分散时间刷,easy的话看看有思路就跳过了,这样等车排队就能人脑刷好几道easy。结果就是需要刷的量大幅降低,而且心里不会因为有题没刷到心虚因为剩的都是easy题。

当然还是要符合自己节奏,如果基础很好刷Hard已经毕竟得心应手可以这么搞。如果死磕一下午5个小时就刷了一道hard,那其实挺浪费时间的,还是打好基础,因为基础好了之后同样的题1个小时就搞定了,水到渠成。
回复

使用道具 举报

我的人缘0

升级   2.5%

ohheylucas 2017-8-17 03:23:52 | 显示全部楼层
本楼: 👍   33% (1)
 
 
66% (2)   👎
全局: 👍   82% (14)
 
 
17% (3)    👎
jingshihao 发表于 2017-8-17 02:58
多谢楼主的分享,非常有用的tips!

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

new grad/intern 面试都有可能被问到系统设计题, 只是概率非常小

评分

参与人数 1大米 +1 收起 理由
剑随风飘 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

我的人缘0

升级   5.13%

 楼主| fentoyal 2017-8-17 02:48:08 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   94% (731)
 
 
5% (41)    👎
帖子4天才通过审核啊。。
如果大家觉着有点帮助,我可以针对某点继续展开。

评分

参与人数 1大米 +3 收起 理由
2011051305 + 3 好像我的权限一次只能加3个米。。。好吧那.

查看全部评分

回复

使用道具 举报

我的人缘0

升级   59.5%

jingshihao 2017-8-17 02:58:38 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
本帖最后由 jingshihao 于 2017-8-17 03:03 编辑

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

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

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

还有一点疑惑,new grad也需要准备系统设计题吗?

评分

参与人数 1大米 +1 收起 理由
剑随风飘 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

我的人缘0

升级   88.5%

Ivor761 2017-8-17 03:29:35 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   81% (140)
 
 
18% (31)    👎
非常总肯。。。感觉自己 还停留在level2上。。。好绝望。level2到level3需要刷多少题?而且您说的level4到面试这个阶段看题,看的是什么题?leetcode里面如果到4级的话应该全刷过了啊。
回复

使用道具 举报

我的人缘0

升级   30.5%

limuzi0609 2017-8-17 03:45:47 | 显示全部楼层
本楼: 👍   100% (2)
 
 
0% (0)   👎
全局: 👍   97% (414)
 
 
2% (12)    👎
刷了200道题左右,感觉也就是每个tag大约都见了见,非常认为自己就在level 2
不过基本都是刷lc,对ide没什么依赖,遇到string确实得去搜api
很赞同楼主的那句话:你不适的感觉,就是提高的感觉。

赞!加米!
回复

使用道具 举报

我的人缘0

升级   5.13%

 楼主| fentoyal 2017-8-17 03:56:25 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   94% (731)
 
 
5% (41)    👎
Ivor761 发表于 2017-8-17 03:29
非常总肯。。。感觉自己 还停留在level2上。。。好绝望。level2到level3需要刷多少题?而且您说的level4到 ...

主要看以前的题,除非你记忆非常好,刷过一遍就过目不忘,否则过一遍老题,保证刷过的600道只要他敢出,你就敢秒杀。同时看看别人解法(如果你当时秒了后没看的话)。
然后可以适当看一下新题。题是刷不完的。LC刷完还有Lintcode(虽然题目差不多),还有geeksforgeeks, codeforces,实在不够刷还可以刷POJ。。而且还可以看面经里有没有新题。
回复

使用道具 举报

我的人缘0

升级   19%

flyMontain 2017-8-17 03:57:01 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (9)
 
 
0% (0)    👎
多谢楼主的分享,看到对level4的描述,自己都不敢想象。
不知道楼主达到level4用了多长时间?
回复

使用道具 举报

我的人缘0

升级   5.13%

 楼主| fentoyal 2017-8-17 04:03:05 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   94% (731)
 
 
5% (41)    👎
jingshihao 发表于 2017-8-17 02:58
多谢楼主的分享,非常有用的tips!

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

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

评分

参与人数 2大米 +4 收起 理由
剑随风飘 + 1 给你点个赞!
2011051305 + 3 感谢分享!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://pay.1point3acres.com/tools/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版|||一亩三分地

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

Some icons made by Freepik from flaticon.com

快速回复 返回顶部 返回列表