作者:胖君
链接:https://www.zhihu.com/question/280279208/answer/499663699
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
龟系
我自己是比较偏“龟系”的刷法【传送 >ciaoshen.com】。从一开始为了找工作,每天4,5题,到后来慢慢变成一种习惯,每天早上起来,喝两口咖啡先来一发。我个人比较信奉Peter Norvig的 “十年理论”。之前Dave Thomas提出的 ”Code Kata“ 也是类似的概念,核心理念就是 “刻意训练” 。现在刷leetcode就是我坚持的“刻意训练”的一部分。日常工作里调调参数,修修Bug,用用框架实际上达不到”刻意训练“的标准。像leetcode这样的OJ正好提供了这样一个”道场“不是很好吗。
我们有的时候过分注重了算法题的“算法意义”,而忽略了”工程意义“。题刷多了就知道,常用套路其实来来回回就那么几个。但明确了算法,能不能准确地实现,做到bug free又是另一回事。再进一步,数据结构用的合不合理,也会影响最终效率。代码写出来,别人好不好懂,又是另一个层面的要求。最后要参加面试,又必须在规定时间里完成,不但要写的快,代码还要干净,符合工程规范。所以”龟系“刷法的精髓就是每个题目要做干净。不要满足于一种解法,各种解法都写一写。我现在accept了350+题,用了1000多种方法。平均每题2~3个Solution。基本每题都做到beats 90+%。
工程意义:符合工程规范,在规定的时间内准确地解决问题,设计合理的数据结构与算法,保证算法效率。
最好不要满足于accept,要追求最高效率。做一题就要杀死一题。leetcode不是给了运行时间的分布吗,基本上每个波峰都代表了一种特定复杂度的算法,中间的起伏体现的就是具体实现细节的差距。每次都要向最前面的波峰努力啊>.<。追逐最前一个波峰的过程不但锻炼算法,还锻炼数据结构,锻炼对库函数的熟悉程度。经常比较不同数据结构不同库函数的效率,时间久了能产生一种直觉,以后一出手就是最优选择。(小贴士:点开竖直的分布条,是可以看到对应代码的,对学习高手的解法很有帮助。)
但“龟系”不是说在一道题上耗死。越是龟系越要注意时间上要掌握好分寸,能解出来最好,解不出来也不要倔强。我觉得比较好的一个平衡点差不多是“一个小时”。如果一个小时还是解决不了可以点开右边Related Topics链接看提示。还是不能解决就看讨论区。 现在一年多坚持下来,最大的收获不是知道了多少算法套路,而是代码硬能力上的进步。之前经常会卡在一些实现细节的地方,现在只要整体方向确定下来业务逻辑捋清楚,具体实现编码反而是最轻松的工作。这就是为什么大厂面试要考算法。功底好的工程师才有精力腾出来考虑工程,产品方面的问题。
兔系
“兔系“更加符合”刷题“的说法,就是按标签刷,按公司刷。今天做binary tree就一下子做10,20题。很多人可能对这个做法有点抵触,觉得太功利,没有思考的过程。当初我也有这个偏见。但后来发现很多最后拿到FLAG offer的大神都这么干。而且过程之暴力令人发指。记得有个大神刷到第三遍,每天可以做80+题。拿到题根本不思考,直接在自带编辑框开始码,而且还基本做到bug free。
我也不知道他是不是在吹,**但“兔系”的精髓就是要暴力,天马流星拳,大力出奇迹。**有的人提倡”不要看答案“。这种观点我觉得是对的,像我自己就很少看答案。但作为兔系选手,讲求的就是要疯,**不如一上来就看答案,就照着答案写。**这个做法看起来不靠谱,其实它有内在的合理性:**大部分算法都不是我们发明的。**什么动态规划,二叉树,线段树,并查集,贪心算法,到后来所谓的不看答案自己做出来,其实都是在用固定套路。到最后你看那些acmer高手,看似思路很快,其实就是知道的套路比你多,而且不是多一点。所以既然明确了是为了找工作的目标,那就放下矜持,放下承见,拿到offer比什么都强,哪怕是以一种羊癫疯的姿势。