这篇是招工求职系列文章的第一篇,前一篇是第0篇。刷题是在美国找Software Engineer最重要也是最难最耗时的一步。就像复习托福有很多技巧一样,刷题也有很多方法和策略能让你事半功倍。这篇将从战略和战术两个方面来聊聊刷题的正确打开方式。战略:越早开始越好不要等到说“我这门Java入门课上完再开始刷题”,因为等你上完Java课,一个月过去了,等你开始刷题的时候,Java基础语法又忘记了,还得重
这篇是招工求职系列文章的第一篇,前一篇是第0篇。刷题是在美国找Software Engineer最重要也是最难最耗时的一步。就像复习托福有很多技巧一样,刷题也有很多方法和策略能让你事半功倍。这篇将从战略和战术两个方面来聊聊刷题的正确打开方式。
战略:越早开始越好不要等到说“我这门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;分析算法复杂度,包括时间复杂度和空间复杂度;然后就是思考如何优化,时空是否存在优化,以及能否牺牲空间换取时间。
第四步,如果按照我说的笔记方法在记录的话,第二遍刷的时候可以按照题号排序来做,夹杂著横刷,这一边遇到不会的先看笔记,一般看了笔记有一点提示就很快能做出来,如果还是想不起来那可以看Discuss然后做,做完把这题作为好题分析去做笔记。
第五步,一般是面试之前,边看面经边按照公司来刷,做到这一步的时候有必要买membership,这样就可以按公司查看。
上传github,加上一定的注释来解释你的代码,一方面为了刷github上repo和submit的数量,刷绿点;另一方面熟悉git这种collaborate的工具。像第一篇里面说到的,使用github是CS素养的第一步,后面会具体写。
如何看答案:点进Discuss,按照vote排序,选择靠前并且使用你用的编程语言的一条,点进去看,Solution是新加的功能,里面一般只有一个参考答案,可以参考。看了别人的答案,高票的一般都很巧妙,并且代码风格都很好,是很好的学习资源,不仅学习他的算法,思路还要学习他的分析等等。看完答案,回去自己重写一遍,重写的时候决不能看答案。
如何做笔记:易错点记录,只要不是一次过的题,就存在易错点,比如语法错啦,边界条件少啦等等。很典型的递归错误就是忘了加退出条件。这样的错误记录了两三遍之后,就再也不会错了。
语法记录,很多常用的语法,比如各种数据结构的初始化比如初始化一个list of listList<List<Integer>> lol = new LinkedList<List<Integer>>();,再比如数组排序,以及如何使用compare函数
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 密码: 86k1wikipedia
Google,任何问题,先问Google,碰到语法问题,程序报错等等,复制到Google里基本都能找到解决方案
早鸟刷题小分队:一篇文章提到了早鸟刷题小分队,这里讲一下小分队规则,很欢迎大家加入,但是要遵守我们定期汇报的规则,四月份的入群条件是能够按照群规按时刷题汇报,五月开始,只有刷题达到我们advance标淮的人才能加入。有兴趣的可以在公众号回复简单的自我介绍。以下是刷题小分队的计划和规则。
每天最少高质量的完成一题,高质量刷题的标淮见上文,建议按照文章里面的顺序
汇报格式:【刷题汇报】4/1 - 2题 - 1 Two Sum; 2 Add Two Numbers;每天睡前汇报今日进度,发leetcode个人主页链接和每题的总结。
每周刷题排名,每周一重置。
惩罚:一个月超过四天没刷题的,自动离开。
奖励:到今年9月份所有留在群里的童鞋你们这五个月的成长将是最好的奖励,除此之外,还有秋招提供FB,以及湾区各大公司内推;简历修改;模拟面试等等后续还会建立项目小分队和内推小分队。
湾区早鸟:开通了微信公众号,获取最新的更新可以扫二维码关注。如果你觉得文章对你有帮助,可以帮忙分享给身边的朋友。
作者: cfdtlee
源自:“湾区早鸟”微信公众号
点击登录