这篇是招工求职系列文章的第一篇,前一篇是第0篇。刷题是在美国找SDE最重要也是最难最耗时的一步。就像复习托福有很多技巧一样,刷题也有很多方法和策略能让你事半功倍。这篇将从战略和战术两个方面来聊聊刷题的正确打开方式。

战略

越早开始越好

不要等到说“我这门Java入门课上完再开始刷题”,因为等你上完Java课,一个月过去了,等你开始刷题的时候,Java基础语法又忘记了,还得重新查Java语法。正确的方式应该是从今天就开始刷题,同时可以在上公开课,看书等等。

效率最大化

做一道题不是做完,accept就完事,如果想刷完一遍对每题都印象深刻,就要做到效率最大化,一份时间当好几份用,刷一遍达到刷好几遍的效果

  • x1 第一遍做
  • x2 复习一遍用到的算法,理解题点
  • x3 做笔记,下次复习的时候能够快速回忆起来关键点
  • x4 分析时间复杂度,空间复杂度,从而思考如何优化

战术

刷题,刚开始会很难,即使对于科班出身,也需要时间去上手。最难的是前20道题,因为这个时候,语法不熟,Leetcode系统不熟,算法不熟。但是一旦熬过20题就会感觉变轻松了,如果是按Acceptance做的话,50-70题又是一个坎,因为你会遇到很多新的数据结构,没接触的数据结构直接做会感觉很难。遇到这样的情况就硬着头皮按着战术去做就是。所以下面是战术。

如何刷题

第零步,选择语言,建议用Java或者C++,选择好了之后,会if else, for loop 就可以开始刷题了。大部分公司不限制面试语言,一些公司比如Amazon会在OA的时候限制只能用Java和C++;选择平台,建议用Leetcode,市面上什么lintcode之类的都是相互借鉴,做一个就好。IDE选择,直接使用Leetcode提供的界面编程。
第一步,按照Acceptance从高到低排序,选题号小于300的做,因为这两年从300增到700题,如果完全按照Ac来做的话前面会太简单,做了100道题可能做得都是easy的,进步太慢。按这个排序做20题,目的熟悉基础语法,熟悉leetcode,不会的就看答案,这里的答案是指Discuss里面的高票回答,看完答案再重写一遍,因为这个时候你不会,基本上是因为语法不会,Ac前20题不会出现复杂的数据结构。

第二步,继续按照Acceptance排序刷接下来的20-50题,每次遇到一个新的数据结构,先查书/wiki,学习这个数据结构,然后做题,做不出来,再看答案,看完重写一遍,会了之后,选择同样数据结构的题横着刷(按Topic来刷,如图)3-4题,这样的目的在于,学习了新的数据结构,马上应用了3-4遍,学习的效率很高。然后再继续按排序做。

第三部,刷题顺序不变,按照Acceptance,同时夹杂着横刷,50-300,但是因为积累了一定的数据结构,所以开始加入分析数据结构,比如为什么用Linked List而不用Array List,为什么用Queue而不用Stack;分析算法复杂度,包括时间复杂度和空间复杂度;然后就是思考如何优化,时空是否存在优化,以及能否牺牲空间换取时间。
$$O(n^2) > O(n\sqrt(n)) > O(n)$$

第四步,如果按照我说的笔记方法在记录的话,第二遍刷的时候可以按照题号排序来做,夹杂着横刷,这一边遇到不会的先看笔记,一般看了笔记有一点提示就很快能做出来,如果还是想不起来那可以看Discuss然后做,做完把这题作为好题分析去做笔记。

第五步,一般是面试之前,边看面经边按照公司来刷,做到这一步的时候有必要买membership,这样就可以按公司查看。

上传github,加上一定的注释来解释你的代码,一方面为了刷github上repo和submit的数量,刷绿点;另一方面熟悉git这种collaborate的工具。像第一篇里面说到的,使用github是CS素养的第一步,后面会具体写。

如何看答案

点进Discuss,按照vote排序,选择靠前并且使用你用的编程语言的一条,点进去看,Solution是新加的功能,里面一般只有一个参考答案,可以参考。看了别人的答案,高票的一般都很巧妙,并且代码风格都很好,是很好的学习资源,不仅学习他的算法,思路还要学习他的分析等等。看完答案,回去自己重写一遍,重写的时候决不能看答案。

如何做笔记

  • 易错点记录,只要不是一次过的题,就存在易错点,比如语法错啦,边界条件少啦等等。很典型的递归错误就是忘了加退出条件。这样的错误记录了两三遍之后,就再也不会错了。
  • 语法记录,很多常用的语法,比如各种数据结构的初始化比如初始化一个list of listList<List<Integer>> lol = new LinkedList<List<Integer>>();,再比如数组排序,以及如何使用compare函数

    1
    2
    int[] arr = {13, 7, 6, 45, 21, 9, 2, 100};
    Arrays.sort(arr, 1, 5);
  • 知识点记录,给每一类题都建一个文件,推荐Dropbox的paper或者Evernote。按前面第二步的方法做的时候将题目归类并记录。记录的时候,就用一句话记录这题的题号,用的关键知识点,和关键代码,这样的好处是下次复习的时候可以快速想起,比如明天就要面试FB了,今天晚上你不可能做新题了,你就可以看你记录的这些关键点,复习效率特别高。举一个List的例子 https://www.evernote.com/l/AKNd6Oijdz5EaK8aBHfybQGOTLWqTt2isbA

  • 好题分析,上一点是每题必须做,这一点是选择性的,当你做到一道题卡了很久,或者学到很多知识点(有好几个follow up),你可以写一篇文章来分析,来记录你是如何一步一步优化做出最优解的。

辅助材料

  • 数据结构Java书,这两本书是我刷题的时候用到最多的书,遇到新的数据结构的题目,第一步就是先翻这两本书,学习一下对应的数据结构,然后回过头看题目,会感觉豁然贯通。
    链接: https://pan.baidu.com/s/1W0-6E316u_nEG3yPOv_GEw 密码: 86k1
    wikipedia
  • Google,任何问题,先问Google,碰到语法问题,程序报错等等,复制到Google里基本都能找到解决方案

湾区早鸟

开通了微信公众号,获取最新的更新可以扫二维码关注。

湾区早鸟