LeetCode该怎么刷题?
利用暑期的时间刷了二遍leetcode。这里写写刷题后的感想。
首先,我是个对算法和Online Coding心里有阴影的人,一直在这方面都不自信。我想原因可能是非CS专业出身,而且自认头脑不太灵光。来美国读研前并没有想到这里找工作会这么重视程序员算法的修养,于是找暑期实习中不断受挫,然后才后知后觉的想既然算法如此重要,而自己有打算在这边找工作,那算法就是个一定要逾越过的那堵墙吧。所以,暑假期间就给自己一个任务,一定要把自己这方面的短板补上,于是我就刷了第一遍leetcode题。
第一遍花了40天时间,这期间基本就是整天OJ。过程有些痛苦,有很多题目自己都想不出来思路,于是就到网上找答案,看人家是怎么解题的。这个过程中基本上能够全面的了解到了算法这门高深学问的几个组成内容。针对面试主要考察的就是基本数据结构:字符串、数组、链表、队列/栈、BST、图,以及算法知识:searching、sorting、recursion、BFS、DFS、dynamic programming、greedy等常用算法。Leetcode基本包含了这些内容,所以通过做这些题目可以很全面的提高自己的算法水平。
我是分类来做的,参考了这个博客的分类。我觉得整理的很好,分类做题的好处是同类题型在一起做后,对这类题型的掌握会更扎实,而且也容易后续进行总结。遇到不会的问题就到网上去找题目的解题思路,然后看牛人写的代码来提高自己的代码水平。这里面对我帮助大的博客主要有Lexi的博客,然后就是AnnieKim的代码。具体就不说了,一个思路整理的很好,一个代码写的整洁优雅,实在让人佩服。
再说下自己在刷题后发现的一些问题:
1,现在很多同学都是处在为了刷题而刷题的阶段。如果为了省时间,很多题目自己不仔细思考,忙于在网上找答案,这样会导致刷完后很多题目都是记住了解法,自己并没有完全理解这个解法后的来龙去脉,如果遇到类似题目,或者稍加修改,往往自己又无从下手了。所以,还是要把来龙去脉掌握了,然后自己把思路写出来,如果你能写的有条理,让别人一下就很容易的看懂你的思路,那我觉得才是你真的理解了这个题。
2,同样的题型还是尽量多总结,争取能够形成一套固定的方法,这样遇到类似的题目很快就可以写出来,而且思路清晰。感觉BFS、DFS、以及DP这几部分题可以好好总结下,都是有固定套路的。
3,能做出来就OK了么?未必,我自己在店面过程中就发现,有些题你是能做出来,但是你未必能把思路清晰的说给面试官,让他很容易的理解你为什么是这么想的?为什么用这个数据结构?往往刷过题的同学,遇到做过的题目一下子就说这题用XXX方法解,但是,如果你作为面试官会怎么想呢?会不会觉得这个人以前是做过这道题才不假思索的就知道用这个方法?即使你写的很快我也会觉得你是记住的,不是自己分析出来的。我觉得正确的方法应该是你要让面试官知道你是从什么信息推断出用什么数据结构?用哪个方法解题?这样才会让他知道你的思路,知道你分析问题的方式。所以,这也是我想拿出一部分题目重新整理下自己的思路的原因。
前两天看到了几篇很好的分析算法的文章,我觉得可以参考下这个人的博客,看看他对算法题目是如何一步一步分析的,很有借鉴价值。