刷完 LeetCode 是什么水平?
观点一
“面试是与人交流的过程”
刷完LeetCode != 会面试
会面试 + 运气 == 能拿到Offer
让我挨个解释:
突发事件:疫情来了,所有作线下服务的都惨了。拿到 Offer 也能收回,甚至 intern 也有不少推迟或是收回的,今年(2020 年)屡见不鲜。
运气(面试)
接下来说
刷完LeetCode != 会面试
“刷完 LeetCode“的定义
LeetCode 有些人是 “纯刷” 的,有些人是 “硬记” 的,有些人是 “理解” 的,有些人是 “掌握” 的。这是我个人认为的 4 个层次。
第一层次,纯刷
纯靠自身功力能作出 LeetCode Medium 题的人,其实面试中并不少见,但大多是经验丰富的码农,或是 CS PhD 等,对普通人的借鉴意义不大。对于普通人来说,如果停留在 “纯刷” 的层面上,面试时碰到还是有很大概率会挂掉的。
第二层次,硬记
亲手写过这道题(Copy Paste 不算) 在做完题后,短期(2 天 - 1 个月,因人天资、状态而异)内不会忘记,但长期一定会忘记
别小看硬记层次。我相信很多进了一线大厂的人,刷 LeetCode 不过是硬记层次。有些人天资不适合理工和数学(比如我自己),但记忆力极佳,短期内能记住大量的东西。这对那种原题面试基本上是有非常大的优势的,因为记得所有的关键逻辑甚至所有的 edge case,不可能出 bug,也就很难挂。
但这种硬记层次最大的问题是:一旦面对题目的变体,比如 Google 面试,很容易抓瞎。因为是真的不会啊!后面还有 Followup 和扩展也很容易露馅。
硬记层次的好处很明显:
适合文科天资、强记忆力弱分析弱基础的人 只要努力,回报特别明显和直接 有些人是先记住,后面才理解的,硬记是一种学习方式,并非效率低
一旦考题灵活,很容易挂,成功率并不那么高 时效性太强,施法前摇太高了 每次跳槽面试都这么搞一把太累,而且伤脑子
第三层次,理解
理解层次我的定义是:
任何时候,拿到这道题,都可以做出来,如果忘记了,也会自己推断和分析出来。换句话说,面试基本上不会挂了(除非是被故意阴了) 真正理解了这道题背后所隐藏的逻辑、思想和算法,并且能够扩展到类似其它问题,以及处理所有的 followup
我很久以前面试时,一些题还处于 “硬记” 层次。这次疫情在家无聊,随手做了几道,发现几年没做题,有些题竟然自己进化到了 “理解” 层次。可见,我自己是典型的 “先记再理解” 的学习类型,也可能是工作强度高导致的个人能力上升。
理解层次最重要的标志就是不需要重新看题也能面试。这其实意义极大:“说走就走”,随时可以面试,意味着根本不怕裁员、被开、经济危机、组里政治斗争,意味着一旦有更好的机会,基本上可以立刻去尝试。而且,如果大多数题都到了理解层次,那么面试的成功率也极其高,很可能是面 5 家拿到 4 个 Offer 这种。
第四层次,掌握
掌握就是不仅完全理解一道题,并且能给人讲清楚,能把 “纯刷”、“硬记” 层次的人,无论智商多少,都提升到 “理解” 层次。
个人认为是没必要修炼到的一个层次,用处不大。要知道题太多,有第三层次基本上面试都不会挂了,有这个时间还不如提升自己的系统设计能力,甚至工作和人际能力。
综合来说,“刷完” LeetCode,很多人只是停留在第一层次和第二层次,但如果大多数热门题已经有第二层次了,也可勉强一战,万一混进大厂就舒服了对吧?这时候运气和经济是主导因素;到了第三层次,基本上无视经济和运气这些因素了,但个人觉得大部分天资普通的人都是在工作几年后才(有时间、有耐性、有悟性)修炼到第三层次的,也不必强求。
刷完 LeetCode != 会面试
最后来解释这个。面试是一门学问、需要研究,这句话没有实际意义,但我想说的是下一句:
面试是与人交流的过程。
作出题不见得拿到 Offer,这已经是业界共识。举个简单例子:很多人能作出题,但交流太烂,基础太薄弱,稍微一问就露馅,就很容易挂。面试不是高考,没有标准答案,没有 100% 客观的评判。
所以,如果面试时 100% 的精力都在做题或是思考或是硬挖出最初的做法,很容易忽视交流和分析,从而交流上失分甚至挂掉。这也是为什么我说 “硬记” 层次面试成功率并不高、而一旦到了 “理解” 层次几乎很难挂的原因:
在 “理解” 层次上,一个人的思维过程就是分析过程,只要同时说给面试官听即可,同时顺便自然地写出代码。换句话说,在这个层次,这人基本上只有 50% 的精力在考虑具体程序,50% 的精力在分析和解说上,自然容易沟通;
而 “硬记” 层次可能 80% 的精力都在回忆自己当时怎么做的、应该怎么解释,所以面试官听不懂,答案 duang 的一下就出来了,很突兀。那么,如果不想花时间、只能达到 “硬记” 的层次,就要加强交流、演说方面的训练。
个人认为,交流不是口语、英文,这也是一大误区。交流,是一种能力,怎么用最简单最实用的办法,让对方明白你的思路、推导和过程。很多美国人的交流也不行,虽然是母语,啰哩啰嗦地说一大堆,最后反而给人一种 “这么简单的事情,话好多” 的反感。
交流的一个重要因素是,要跟别人在同一个平面:不仅仅要知道题的做法,还要知道别人一般是怎么想的、怎么能给他(她)解释清楚。
这样看,面试又不简单了:因为实战中,最多只有 50%-70% 的精力在应付题本身,而平时做题是 100%。
所以,刷完 LeetCode 的人,很可能面试还不够熟练,甚至还没入门、还会犯低级错误。这也是我认为 “刷完 LeetCode != 会面试” 的根本原因。
当然,最后抬个杠,LeetCode 不会刷 “完” 的,子子孙孙无穷匮也。1000 多道题,最后只能让第二层次 “硬记” 越来越困难,客观上是逼迫所有人往第三层次 “理解” 发展的,即:
LeetCode 做完多少题,已经不是一个指标了;更关键的是,一个人 “理解” 了多少题。
观点二
尽量精刷
在 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 分的水准,比较弱。
刷 LeetCode 之后:
tips for interview:
https://github.com/conanhujinming/tips_for_interview/blob/master/README-zh_CN.md
刷 LeetCode 尽量还是精刷。但即便你像我一样基础一般又懒得精刷,单纯地堆砌题量也能搞定大部分公司出的题了。建议多做那种自己要费一些力气才能做出来,但又不是完全做不出来的题,然后少做自己可以秒杀的题。可以找小伙伴组队一起刷,相互督促鼓励交流讨论,共同进步~
观点三
又说又练才是真把式
以上是比较 “硬” 的 “说的明白”,下面还有比较 “软” 的 “说的明白”。也就是现在 HR 们常说的软技能。
1. 你是否能问对问题?
这里既包括一些 clarifying 的问题, 也包括你是不是能合理的要到面试官的提示。
2. 你是否能说清楚你的思维过程?有逻辑,有条理,而不是给面试官感觉你事先看过答案。
有些朋友看完题上来第一句话就是 “这题用 DP”,你以为你在打 ACM 个人战吗?你不和你队友说下思路吗?难道不是先找一些子结构,装模作样的试试看,然后再说 “这题可以用 DP,元芳,你怎么看” 吗?当然,你也不用太戏精,自然就好。
3. 你是否能接着面试官给的提示进行思考和讨论,而不是固执己见。
关于这一点,我想很多朋友会看过一些面经,有时候候选人已经是给出最优解了,但是面试官会给出不同的意见,引导候选人去做一个其他的解法。这是为什么?是面试官不知道最优解吗?有这个可能,但也有可能是面试官通过这一点来和你沟通,看你如和应对。往往无视面试官意见的朋友,是不容易得到很好的反馈的。当然,我也不是说面试官说啥你都照做,因为可能因为你被面试官故意误导或者他也真不会造成题目没有及时做出来。如何说服对方,这就又是一门学问了。
4. 你是否能控制好时间,控制节奏,甚至引导面试官来到你更熟悉的领域。
其实软的东西有很多,我以后还可以继续补充。我说这些也不是吓唬大家,让大家焦虑,其实也没必要焦虑,因为这些软技能咱们大多数程序员都很一般,很少有特别好的。不管你是不是科班出身,学校也不教这个。但也正因为咱们都起点比较低,所以提升的空间才大,你稍微努力练习一下,就能有机会脱颖而出。
我建议:
找几个朋友互相练习,你要习惯在团队里工作 一边刷题,一边自言自语讲自己的思路,自问自答 把自己做题和自言自语的视频录下来,像我这样
我觉得如果你能把以上把握好,那么你算法 coding 轮应该可以得到不错的分数。可面试还有系统设计轮和 behavior 问题轮啊,这些怎么办?
其实 “说的明白” 是相通的,面试不仅仅是知识水平的较量,同样也是你和你未来同事的第一次合作,面试官和你心里都会装着同一个问题,你以后愿意和这样的一个人天天说话吗?所以说呢,把 “话” 说好,会为你的面试加分不少。
https://www.youtube.com/watch%3Fv%3D7oJ-5CShtUQ
喜欢文章,点个在看