鉴于近年来LeetCode刷题被神化,被认为是面试必备
所以我想以5年多以来无论是当面试者还是当面试官的经验
来分享一下如何准备面试
首先先分享一下我的经历
我不是什么强者,没有参加过ACM竞赛,Code jam顶多做两题
美国硕士毕业后,LeetCode刷了250题左右,Google onsite后被HC拒了
去了另一家公司后,待了几个月上个简单的课之后就开始当面试官
才开始理解到面试官要的是什么,之后FLAG里除了FB没面过外其他Offer都拿过了
以下从面试官的角度分析该怎么准备
面试官不是专业的
面试官其实只是工程师稍微上点课知道什么该问什么不该问,还有态度该如何
除此之外和你一样就只是个工程师,因为平常都在工作对刷题肯定比你陌生
所以大部分面试官其实都只关注几点(应该说是被要求要注意哪些部分)
1. 有没有问对的问题
其实主要是想要看面试者的互动能力,通常面试官会简单的把题目叙述一下
这时候就是希望面试者可以主动重述题目,然后对题目的外在环境提出问题
例如: input的范围限制?、data是online/offline?、output的格式?
这时候就是想测试面试者有没有能力把一个问题转化成一个可执行的计画
2. 程式码的可读性/干净程度
理由很简单,面试官都是假设以后要和你一起工作的,所以平常练习请把程式码写干净
变量命名合理一看就知道作用,一个function一个用途,不要挤太多不相关的逻辑
可读性差通常在评分上是致命的,而且是大多面试官无法忍受的
3. 沟通、沟通、沟通
面试官都被要求把面试当作和一个不熟的人一起做个小专案
这时候沟通很重要,不要让面试官一头雾水不知道你现在的进度是哪里
就算你知道题目怎么做,你解题的流程可能也和面试官不同,或者是对实作的见解不同
沟通在评分上是"绝对致命",你闷头自己把答案写出来不代表很聪明
而是未来和你工作很辛苦
4. 测试!
这是刷题的后遗症,面试没有一键测试这种功能
请自己在重述题目时顺便想好哪些可以测试的input/output,并且包含edge cases
很多时候不是自己解题的想法错了,而是实作中的bug
面试官也不会主动帮你走程式的流程来帮你验证对不对,请自己证明自己写的是对的
少了测试有时候你会听到面试官说:“我想应该是对的吧”
这时候回头肯定会在你的评分里写上少了测试
少测试的扣分可大可小,看题目的难易度
5. 有没有解出来,有没有optimal solution
其实这部分只要有个一般解,测试过了,基本分就拿到了
optimal solution基本上除非你是被考了很简单的问题
不然只要你能和面试官讨论怎么优化,有哪些trade-off,就拿到基本加分了
实作不是一定必要,或是一定得写完整,因为你的一般解已经展现实作功力了
以上是大公司FLAG/FAANG的基本面试要点
一些新创的奇怪面试又是另外一回事,也很难分享如何准备
另外System Design是一个比较难标准化的东西,所以我就不献丑了
回到要不要刷题这个问题,我认为的是
- 刷题可以帮助你熟悉/复习算法和资料结构,所以刷一下是需要的
- 题数不用多,如果你可以看到一个题目立刻知道怎么解,那题就不用继续写了
- 刷题请给自己限时,1小时/45分钟的面试通常只会给你45/30分钟的做题时间
扣除掉各种沟通问问题的时间,我都是给自己每题20~30分钟
- 如果你确定onsite要用板书,做题时请分配一些给自己用纸笔作答
- 自己先想好怎么测试,不要过度依赖LeetCode的工具
- 语言不重要,除非你确定你要面试的公司只考特定语言
- 考前请人给你mock interview训练临场反应和沟通,这和刷题同等重要
以下刷题数仅供参考
因为我每次重新刷题都会开一个新session,所以有记录我每次刷的题数
第一次跳槽90题,拿到Apple、VISA和新创(其实Apple不考算法题)
第二次跳槽110题,拿到LinkedIn和独角兽新创
第三次跳槽140题,只面Google且拿到Offer
最后祝大家Offer拿好拿满,希望这篇文章能帮助不知从何准备面试的人