先学好数据结构与算法
有些人数据结构与算法的基础都没有,就跑去刷题了。然后就问,诶这个不是二叉树吗,不是应该是一堆节点组成吗,为什么就只给我一个 TreeNode 就没了?空间复杂度是 O(1) 是什么意思?是只能用一个额外变量吗?二分查找又是什么?然后就迷失在术语的海洋中,每做一道简单的题目就要额外花大量时间去学习他们没有接触过的概念。
这种在做题中学习基础的方法不能说错,也是有一定作用的。但是这样做效率很低,不能有效地形成知识体系,其中最致命的问题是不能形成有效的正反馈。
试想一下,你刚开始做算法题,发现做任何一道题都是寸步难行,试了半天还是没有通过测试用例,看了题解不能完全理解,里面还有些你没了解过的概念,好不容易跟着思路做出来了或者还是想不到直接拷贝粘贴,一看时间一天过去了。然后你想到以后每做一道题都是这样,你可能有点崩溃。
另外就是面试题不一定就是 LeetCode 上的题目,比如可能会直接让你写个插入排序。只做 LeetCode 算法题其实是挑食了。
所以,在去 LeetCode 刷题前,还是建议你先学完数据结构与算法这个课程。市面上有很多的经典书籍,网上也有一些评价不错的相关教程,先跟着系统学习各种数据结构和算法的概念,用 JavaScript 或 TypeScript 基本上实现一遍,才算是入门了。这之后去刷算法题自然就事半功倍。
按题型刷题
刷题最好是分题型进行刷,一段时间只刷一种类型的算法题。比如这两周我就只刷二叉树,后面两周只刷二分查找。这样我们可以通过高频的练习来巩固特定的题型的解题套路,以后遇到类似的题目就有感觉。
另外建议做面试高频题,因为它们更经典,且面试也更容易遇到。比如二叉树的高度、反转链表。
如果可以的话,最好刷完一种题型的题后,再写一篇针对特定题型的文章归纳一下套路。
建议用 TypeScript 刷题
原来我是用 JavaScript 刷题的,直到好几次调整递归函数的参数,在调用递归函数的地方忘了改传参,然后调试了大半天才发现只是参数没传好。那时的我悲痛地认识到:早知道,还是 TypeScript。JavaScript 真的是让我无语凝噎。
TypeScript 在用编辑器写代码的时候就能发现类型错误,大大减少了我 debug 的时间。如果你考虑到面试的可能不会给你智能提示,觉得太依赖类型的智能提示不好,那你也可以去记事本上写,然后复制到 LeetCode 代码编辑器上。
一些题目如果要用到 JavaScript 没有内置的数据结构,可能就需要你自己去实现了。比如像 用栈实现队列、用队列实现栈 这种题目。当然如果你熟悉 Java 的话,可以用 Java,因为Java 提供各种好用的数据结构,基本上刷题要用到的都有。
适度
请根据自己的水平选择题目难度。要做那种自己踮起脚来摸得到的题目,不要总是做舒适圈内的题目,少做那些即使你跳起来也做不出来的题,这样的练习才是有效的。
提高刷题能力是个长期的事情,建议定个适合自己的长期目标,比如一周刷 5 道题,周一到周五一天一道,没完成就周六日补上,形成习惯或者说是节奏。不推荐一天刷一堆题目,刷到麻了,然后一周都不刷题,很容易半途而废。刷题贵在坚持。一周 5 题,一年就能做 260 题左右了,已经不少了。
最后,刷算法题题是长期的事情,慢慢来,不要急,每天进步一点点,长期就是进步一大步。