刷完 LeetCode 是什么水平?能拿到什么水平的 offer?
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
观点一
“面试是与人交流的过程”
作者|硅谷IT胖子
https://www.zhihu.com/question/32019460/answer/1214537663
刷完LeetCode != 会面试
会面试 + 运气 == 能拿到Offer
运气(大势)
运气(面试)
刷完LeetCode != 会面试
“刷完LeetCode“的定义
亲手写过这道题(Copy Paste不算)
在做完题后,短期(2天-1个月,因人天资、状态而异)内不会忘记,但长期一定会忘记
适合文科天资、强记忆力弱分析弱基础的人
只要努力,回报特别明显和直接
有些人是先记住,后面才理解的,硬记是一种学习方式,并非效率低
一旦考题灵活,很容易挂,成功率并不那么高
时效性太强,施法前摇太高了
每次跳槽面试都这么搞一把太累,而且伤脑子
任何时候,拿到这道题,都可以做出来,如果忘记了,也会自己推断和分析出来。换句话说,面试基本上不会挂了(除非是被故意阴了)
真正理解了这道题背后所隐藏的逻辑、思想和算法,并且能够扩展到类似其它问题,以及处理所有的followup
刷完LeetCode != 会面试
观点二
尽量精刷
作者|胡津铭
https://www.zhihu.com/question/32019460/answer/887877092
算法弱鸡过来强答一下。
在LeetCode上前后一年多陆陆续续刷了760道题左右,基本上把大部分的免费题刷完了。
刷LeetCode之前的基础:
本科非CS,与CS相关的课只有一门C++,跟过Coursera上的Algorithm课程,学过基本的数据结构。胡乱看过Algorithms的前几章和CLRS书,前者跟着课看的话大部分能看懂,后者很多看不懂。扫过CLRS的一些习题但太菜了做不动。硕士转了CS,也没上过算法课和数据结构课,做的是机器学习方向。这时候做LeetCode上难一些的easy题就会很吃力,medium中比较简单的题可能能做出来,hard一道都做不出。
刷LeetCode的方式:
先从Top100 liked 的tag开始刷(这个tag的题我刷了好几遍)。刷完之后按topic的tag刷过一段时间,后来改成了选择难度之后按顺序刷。一开始就按照ac率从高到低乱刷,后面就只刷点赞比点踩多不少的题。有一段时间每周的周赛基本都参加,不过最后也就是2000分的水准,比较弱。我一道题如果较长时间想不出来(比如半小时到一小时),就会去看discussion,主要是太懒了不想动脑子。自己A了的题也会去看discussion,去学别人比较好的解法(后来是学写法),然后自己照着敲一遍。不会或者不是最优解法的题,过一段时间如果记得的话就再做一遍,不过一般都是不记得了:(
刷LeetCode之后:
大概刷了400多道题之后开始找实习,这个时候的水准是hard多数做不出,medium基本都能做出。找实习的时候比较闲,大概面了10来家公司,吃到了hulu的拒信,其他的公司例如Google/MS/阿里/腾讯/头条这些都算是比较轻松地拿到了offer。hulu的题当时确实就是做不出,实力不济。然后后面比较闲又刷了些题,秋招开始的前一个月因为忙和懒就没怎么刷题练习了,这个时候的水准是hard能做出一部分吧。秋招面的公司不多,有Google/阿里/腾讯/头条之类的,算法/研发岗都有投,都拿到了offer,国内企业的话给的都是ssp。就做题而言,个人感觉是外企hulu/airbnb的题不一定能做出来,国内的企业的话头条的题可能会碰到些挑战(据说很多创业公司/独角兽公司的题很难,不过我全都没投,就不知道怎么样了)。当然了,面试涉及的因素/能力很多,还有沟通交流、项目、其他cs/机器学习基础等等,那就是另外一回事情了。我在Github上有写一些这方面的总结,也写了一些自己转专业自学CS的心得,也欢迎参考~
tips for interview:
https://github.com/conanhujinming/tips_for_interview/blob/master/README-zh_CN.md
总结:
刷LeetCode尽量还是精刷。但即便你像我一样基础一般又懒得精刷,单纯地堆砌题量也能搞定大部分公司出的题了。建议多做那种自己要费一些力气才能做出来,但又不是完全做不出来的题,然后少做自己可以秒杀的题。可以找小伙伴组队一起刷,相互督促鼓励交流讨论,共同进步~
观点三
又说又练才是真把式
作者|北南
https://www.zhihu.com/question/32019460/answer/1211129124
如果你是把目标定在了互联网大厂,包括一些临近上市的当红炸子鸡,那我觉得你不仅仅要题目“做的出来”, 更重要的是要能“说的明白”。
正所谓光说不练假把式,光练不说傻把式,又说又练才是真把式。
做的出来这一步我不多说了,几个高赞回答都说的很好。做的出来是一切的基础,是后续沟通的前提。
但“做的出来”不是最终目的,你面对的是一个有灵有肉的面试官,而不是自动测试的机器,否则一个leetcode这样的系统不就可以取代面试官了?你的目的是让对方喜欢你,是用“说”来让对方知晓你的能力,也是用“说”来战胜其他竞争者脱颖而出。那我就重点来说一下“说的明白”
1. 说清楚算法的时间复杂度和空间复杂度,这个很多算法会有平均情况和最差情况, 你也要讨论清楚什么时候会出现最差情况。
2. 说清楚各种边界条件,要知道如何测试你的代码。比如说对于输入为空返回什么等等。leetcode设计的那些test cases是这个网站价值的重中之重。
3. 说清楚算法的适用条件,也就是什么时候这个算法才是正确的。比如说如果图中有边的长度是负值,那么dijkstra算法还能用吗?又比如说选取top k这种题会有好多种算法,它们之间的优劣又是怎么样的?在什么情况下某种算法才是最优的?
4. 讨论多线程或者分布式的情况。很多公司会在你题目做完后,给你几个follow up。比如说就会问你,如果把你的算法放到100台机器上,这个算法还成立吗?要如何修改?
5. 讨论极大数据量的情况。和第4点类似,比如说你做个排序,如果内存中放不下所有的元素,你如何处理?时间复杂度和空间复杂度又会有怎样的变化?
以上是比较“硬”的“说的明白”,下面还有比较“软”的“说的明白”。也就是现在HR们常说的软技能。
1. 你是否能问对问题?
这里既包括一些clarifying的问题, 也包括你是不是能合理的要到面试官的提示。
2. 你是否能说清楚你的思维过程?有逻辑,有条理,而不是给面试官感觉你事先看过答案。
有些朋友看完题上来第一句话就是“这题用DP”,你以为你在打ACM个人战吗?你不和你队友说下思路吗?难道不是先找一些子结构,装模作样的试试看,然后再说“这题可以用DP,元芳,你怎么看”吗?当然,你也不用太戏精,自然就好。
3. 你是否能接着面试官给的提示进行思考和讨论,而不是固执己见。
关于这一点,我想很多朋友会看过一些面经,有时候候选人已经是给出最优解了,但是面试官会给出不同的意见,引导候选人去做一个其他的解法。这是为什么?是面试官不知道最优解吗?有这个可能,但也有可能是面试官通过这一点来和你沟通,看你如和应对。往往无视面试官意见的朋友,是不容易得到很好的反馈的。当然,我也不是说面试官说啥你都照做,因为可能因为你被面试官故意误导或者他也真不会造成题目没有及时做出来。如何说服对方,这就又是一门学问了。
4. 你是否能控制好时间,控制节奏,甚至引导面试官来到你更熟悉的领域。
其实软的东西有很多,我以后还可以继续补充。我说这些也不是吓唬大家,让大家焦虑,其实也没必要焦虑,因为这些软技能咱们大多数程序员都很一般,很少有特别好的。不管你是不是科班出身,学校也不教这个。但也正因为咱们都起点比较低,所以提升的空间才大,你稍微努力练习一下,就能有机会脱颖而出。
我建议:
找几个朋友互相练习, 你要习惯在团队里工作
一边刷题,一边自言自语讲自己的思路,自问自答
把自己做题和自言自语的视频录下来,像我这样
我觉得如果你能把以上把握好,那么你算法coding轮应该可以得到不错的分数。可面试还有系统设计轮和behavior问题轮啊,这些怎么办?其实“说的明白”是相通的,面试不仅仅是知识水平的较量,同样也是你和你未来同事的第一次合作,面试官和你心里都会装着同一个问题,你以后愿意和这样的一个人天天说话吗?所以说呢,把“话”说好,会为你的面试加分不少。