6个月简单粗暴刷题转码经验总结

avatar 193571
anmour
22863
102
背景

楼主之前在一家大概30个人左右的start-up做ML Engineer,去年9月的左右,在LinkedIn上收到狗家recruiter的邮件,问有没有兴趣跳槽。由于狗家和脸家一直是楼主的dream company,再加上想去大厂见见世面,于是动了跳槽的念头。准备面试的方向是ML和SDE,因为之前做的工作跟ML有关,再加上帮公司面试了不少candidate,所以主攻方向是非常薄弱的coding。从2019年9月到2020年3月,6个月的时间,一共刷了800道题,大部分常考题大概平均每道题刷了5遍左右。

前期准备

楼主在本科的时候学过algorithm and data structures,但是年代久远了有点生疏了,在开始刷题之前正巧在coursera上学了一遍Tim Roughgarden的algorithms specialization。个人感觉介绍了一些高级的数据结构对之后的刷题还是有所帮助的,比如说Union Find,当时是第一次听说这个数据结构。

攻坚阶段

不得不承认,刷题真的是很痛苦的一件事,特别是刚开始的阶段。作为非CS科班出身编程基础极其薄弱的菜鸡来说,个人秉承的核心思想就是反复的刷,读书百遍其义自见,简单粗暴。楼主其实刷题的时间也不多,因为白天要上班,所以基本就利用每天下班的时间和周末。期间还出去浪了几次,在候机的时候还抓住边角时间刷了几道😂

核心思路:

大量的刷题和反复的刷题。个人感觉,刷题就跟高考数学差不多,就是通过不断的练习,掌握解题的思路和技巧,没有捷径可言,而且要做到每道题至少刷3遍,最后做到一看到题马上想到最优解。

刷题经验:

  • 第一遍按照Leetcode的tag分类,然后按照频率排序,优先做高频题,不管难度,如果是近两年都没有出现过或者近两年面过的公司不是FANNG则直接跳过。第一遍刷题,如果十分钟以内想不出来,那么直接看答案或者网上别人的解法,同时在Leetcode上用笔记记录思路,然后理解答案的想法,记住要背容易记忆和理解的最优解法。第一遍不会做不用灰心,因为这一遍的目的是背答案,答案背多了自然能从题中找到规律。最后用一个list记录这一轮第一次没有做出来的题。

  • 第二轮重复第一遍的过程,还是按照tag分类和频率排序,并且还是只考虑十分钟,如果第一轮看答案才做出来的题目,这一轮没有看答案就做出来了,说明你已经背下了答案,把它从第一轮的list挪到一个新的list。我们的目的是如果连续两轮完全没有看任何提示就做出来了,那么表示这道题你就掌握了。

  • 第三轮重复第二轮,再按照tag分类和频率排序,这一轮我们考虑二十分钟,依旧秉承一个原则:连续两轮完全没有看任何提示做出来的题目,代表你已经掌握了,哪怕是已经把答案背下来了。到第三轮的时候,你应该会有2个list,一个list是做了三遍还是没有任何思路的题(也就是对于自己而言比较难理解的题),还有一个list是第一次没做出来但第二次没有看任何提示做出来的题(也就是对自己而言还没有完全掌握的题)。

  • 第四轮,根据自己创建的list,只给自己五分钟的考虑时间,过一遍前三轮创建的两个list,清空那些连续两轮都做出来的题,然后把那些之前没思路的题但这一轮做出来的题移动到另一个list。如果你坚持下来,那么到这个时候,你应该已经刷了5-600道题了,然后实际完全掌握的肯定有50%以上,大概300道题。

  • 第五轮,根据自己面试的公司,刷近一年该公司面过的题,按照频率排序。如果时间允许,把所有出现的题都做一遍,保证看到原题立马想到最优解。

关于遇到不会做的问题怎么办的问题,楼主的经验是立即看答案,比较重要的是怎么看答案。楼主一般很少看leetcode自带的答案,因为感觉很多时候感觉解释的不清楚,所以楼主一般是google,有几个博主(在此就不打广告了)的解题思路楼主很喜欢,很清楚。一般会对比几个不同的解法,掌握对自己而言最容易理解的解法。看答案的时候,一定要把解题思路和实现细节思考清楚,并且做好笔记,比如说这道题的trick在哪里,用什么样的数据结构。有一些复杂的解题思路楼主会看Youtube视频,还有一些不好找的楼主就参考leetcode discuss里的解法,选最容易理解的。所以,个人认为,看答案的过程同样重要,通过对比理解不同人的解题思路,楼主也渐渐从中得到了一些启发,刷到后面遇到没见过的题也基本开始有了自己的解题思路。所以,个人的建议是,遇到不会的题目,不要怕看答案,但看答案的时候,一定要理解透彻,并死记硬背。一遍记不住就两遍,两遍记不住就三遍。

面试阶段

  • 黑车:recruiter联系的,ATG的SDE,也是最先面的(19年12月),一面惨不忍睹,刷题网原题,medium难度,但是卡了好久导致都没时间回答follow-up,面完还被面试官呵呵了一下,果不其然秒拒,收到recruiter好人卡一张。
  • 狗家:狗家是recruiter联系我的,职位是SDE,但偏ML。经历了黑车的惨败以后,楼主痛定思痛,蒙头刷题,把狗家电面推到了20年1月。一面小哥特别nice,有惊无险进入onsite。楼主很怂的推到了3月份,于是3月中的onsite,4轮coding+1轮BQ,一道ML的题没问也是醉了。有一轮面的很差,但有惊无险,最后送hc,hc也顺利通过,team match也迅速通过。感觉楼主幸运在疫情大爆发前拿到了offer,所以没有受到hiring slow down的影响。
  • 亚麻:recruiter联系的,AS II,在虾图。一面主要是ML+coding,coding特别简单,原本应该是三十分钟的五分钟就做完了😂,然后小哥开始狂问BQ😂。电面完一周很快通知onsite,楼主安排在了狗家onsite之后,所以就改成了VO,3轮ML + 1轮coding + 1轮纯BQ。亚麻最难的应该就是BQ了,每轮都有,多准备好例子就好了。coding的话面完狗家以后觉得完全是小儿科😂。ML的话楼主要复习了一下基本ML的教科书,看了几遍Andrew Ng CS229的讲义。最后基本主要是问了楼主做过的project,所以难度也不大。
  • LinkedIn,找同学refer的,推了senior MLE的职位,电面又是惨不忍睹,面试官出的coding是跟统计有关的,不按套路出牌,完全没做出来,面完果不其然被秒拒,收到recruiter好人卡一张。
  • 脸家:找同学refer的,两三天后收到recruiter邮件说我的简历跟内推的职位不match,于是跟recruiter聊了聊,最后说是会帮我留意职位,再联系我。后来貌似帮我群发了简历,但最后也没收到面试,所以注定跟脸家无缘了😂

总结

  • 最后拿到了狗家SDE L4和亚麻AS II的offer,因为狗家match了跟ML非常相关的组,所以不算是纯码,权衡了很久以后,决定接了狗家的offer,忍痛拒了亚麻。
  • 楼主因为是一心想去大厂做ML相关的,所以基本只考虑了FLAG,也没怎么投其他公司,所以大量的时间都花在了刷题上。

最后祝大家在疫情期间都心想事成,注意安全。
  • 508
102条回复