6/2/2019更新。这篇文章主要分为两个部分,在前半段我们讨论了刷题的细节和姿态,在后半段讨论了如何在漫漫征程中保持战斗的热情
现在刷题的军备竞赛非常夸张,大家都是被逼的。当然有些公司不怎么考算法题,不喜欢刷题的同学可以试一下,比如twitter;但是大部分一线公司需要通过算法题来刷人(算法题真没什么用,主要就是刷人用的。)
关于刷题我最爱的一句话是结硬寨打呆仗(曾国藩湘军打太平军时的策略)。 刷题没有捷径,要下笨功夫。一定的刷题姿势有一定帮助,但是不是那么重要。 当你刷题数量不到 200道的时候,说什么姿势都是白瞎。
数量到了以后也不要贪图题目数量,要追求以下几点
1. 旧题一定要做熟,短时间内要bug free的写出来。如果你不能bug free写出来,那你还是不熟, 请继续练习没有借口。
2. 想想一题多解,每种办法的优缺点是什么。
3. 最优解. 但请勿追求奇技淫巧。
4. 时间复杂度,空间复杂度。
5. 代码简洁,规范,美观,可维护性。
6. 掌握一些套路,并熟练使用。
7. 每道旧题都当新题来做,从头分析, 绝对不能偷懒。
8. 要练习讲题,面试的时候要能够讲清楚。先从high level, 再讲detail。
9. 分类做题可以对特定知识点强化记忆,很有效果。
10. 不要上来就刷hard题。在算法没有基础的情况下,手刃hard 是一件很有成就感的事情,不过你真的需要这个成就感吗? 先刷easy, medium 把所有知识点扫一遍盲最重要。
11. 基本功一定要扎实, 基础题要写的非常熟。比如树的各种traversal, quick sort, merge sort, heapify, reverse linkedList, recursion
CS面试真的不是考智商,只要你努力就能搞定,只要努力就有机会。
下面是每一条的详细解读
5。 为什么代码要简洁规范美观 ? 代码是给机器读的,同时也是给人看的。某一天同行会看你的代码,你一定要做一个好的同事,让别人更容易看懂你的代码节省后续开发的时间。 有的时候你会发现,为什么明明我算法对,代码也对,可为什么面试没过,一条原因可能是你代码太丑了,别人一看就是半路出家的(没有恶意因为我也是半路出家的)。当然还有很多其他原因可以挂掉面试,随缘随缘。
2。为什么要一题多解:一道题可以有多种解法,但我们掌握一种不就够了吗? 当你遇到这道题的变种,你掌握的唯一一种解法可能不能工作,这时如果你知道这道题的多种解法的话,可能另外一种解法更适用于这种变种。当你袖子里有足够多的trick时,你就能更容易面对各种变种各种follow up。
7。 为什么要把每道题当做新题?a. 面试的时候要展示你的思维过程 b. 思维训练,训练的多了,你遇到了新题就习惯了分析就不觉得难了; 训练的多了你就分不清新题还是旧题了;训练多了,遇到新题其实也是旧题了
11 为什么要反复写基础题目。基本题目的code是implemention层面的, 复杂题目的算法可能比较复杂,但是他的code很多时候可以分解为多个基础题目的组合。这时简单的sort, traversal, linkedList 一定不能成为你的拦路石。 应该机械化的能把基础题目快速写出,把思考的注意力集中在算法层面。
下面说一点别的方面,如何保持我们的战斗热情。
刷题转码是一个很漫长的过程,以前传说的男刷半年女刷半月基本已经不太可能。一个理工科背景但完全没有编程背景的人花上18个月以上非常常见。在这样长的过程中保持高昂的战斗热情是很重要其实是一件很难做到的事情。
首先我们要制定一个目标,要有一个goal.
这一点是老生常谈,但是有时这件事情太司空见惯所以被忽略, 所以我这里特意提了一下下。我还想强调一下这个目标一定要是可以衡量的,可以量化的。一个比较符合这个标准的目标的例子是“600道题刷三遍 ”, 这个目标可以量化可以衡量可以分阶段实现。一个不太好的目标是“要刷进FLAG", 这个目标很好但是不好量化。
第二点是我着重想讨论的就是我们一定要有一个进度条来测量我们的进度。进度条是程序员最伟大的发明之一。进度条给人一种掌控感。经常查看自己的进度条可以知道自己离目标还有多远, 不致于路途太遥远而中途退出。
一个可以量化的目标能给我们一个有效的进度条。每天看着自己的进度条一点点向前推进,能给你一种成就感。山高路远,你需要一个进度条来保持战斗热情。一句题外话是之前有个新闻说中华民族伟大复兴的任务已经完成了62%。有点搞笑,但你差不多就需要这么一个进度条,知道自己离自己的目标有多远。
我自己常用的进度条主要有以下几个, 1. 700道题的完成比例; 2. Leetcode 个人页面 5个五角星你把鼠标放上去会看到一个数字,这个数字是你刷题量的世界排名; 3, Leetcode weekly contest的排名, 当你周赛稳定前400名的时候去面谷歌就没什么问题了。
我还写了一篇博文讲自己大龄转码工的经历