我的算法学习之路
收藏

作者:小争哥(王争,前Google工程师,《数据结构和算法之美》作者)

公众号:小争哥

今天,扯个闲篇,说说我的算法学习之路,都是故事,没有干货,你就当个段子看看吧。

 

山东是个教育大省,每年高考人数稳居全国第一。生在山东,实际上是件挺悲催的事情。满分750分的卷子,山东考生要考到700分以上才能上清华北大。我当年高考语文考的很失败,满分150考了整整100分,算是发挥失常吧,最后总分680分,为了稳妥,最后报考了西安交通大学的电信学院的本硕连读班。

 

我们学校的本硕连读班是可以在学院内任选专业学习的。我记得很清楚,大一第一节课是梁老师的C语言课,上完之后,100多个本硕连读的学生,只剩下7个人选择计算机专业方向了,因为其他人都觉得编程太难了。当然,这7个人里就包括我。

 

真正接触计算机是大二的时候,自己在西交大的BBS上买二手零件,组装了一台二手电脑。也就从那开始真正的接触编程。在大学的最开始,实际上,有很多同学的编程能力都比我强,因为他们接触计算机、编程比我早,有些同学高中的时候就学习编程了。但最后我都远远把他们甩到了后面,因为他们后来就放慢节奏甚至原地踏步了,而我一直都在拼命的跑。

 

开始狂学算法和刷题应该是从大三的时候。最开始是把《数据结构和算法C语言实现》这本书里所有的代码和课后题都在电脑上敲了一遍。感觉效果非常好,既锻炼了编程,又锻炼了算法。在之后就是把《算法导论》里面的所有的代码和课后题又都写了一遍。从那以后,我就感觉自己对编程和算法入门了。

 

在之后就是开始高强度的刷题了。当年我刷题的时候,好像还没有leetcode吧,有的话,貌似也不火。当时大家刷题还都是在各大高校的OJ上,比较出名的是北大的和清华的。读大学的一个好处就是人比较闲、体力好、精力旺盛,可以有大把的时间做自己喜欢做的事情,把一件事情做到深、做到极致。当时沉迷于算法、刷题,早上一睁眼就开始刷题、看各种刷题经验,一直刷到晚上11点,真的是废寝忘食。现在想想,也庆幸在那个时候刷了题。如果放到工作之后,且不说有没有时间,体力也跟不上啊。

 

大学加研究生这段时间,我有记录的刷题应该在700多道,加上零零散散各个小OJ上刷的,总共应该有1000道左右。这个刷题量实际上是挺大的。所以,在研究生毕业找工作的时候,我也得益于这些刷题经历,拿offer无数,Google、Hulu、BAT Special Offer...你能想到的,我基本上只要愿意去面试,都能拿到Offer。毕竟,校招比较喜欢考察算法。

 

当然,光刷题不总结也是没用的。有些人刷了很多题,也没能进Google、Facebook一样。这就相当于你做1000道数学题,也并不一定高考数学就能考高分一样。对于如何刷题,如何具有快速A题(A=Accept,刷过OJ的人都懂得)的能力,实际上,我有蛮多经验可以分享的。我现在的电脑里还保存了10年前刷题的一些资料和经验总结。写这篇文章的时候,我把它翻出来看了下,总共有1个多GB大小。除此之外,我还有四本手写的上百页的刷题经验总结。小伙伴们如果感兴趣的话,我也可以在闲了的时候,想办法通过某种形式分享给大家(现在太忙了没时间整理)。

 

 

不过,现在大家刷题都是在leetcode上,因为leetcode上的题目更加偏重面试,难度相对各大高校的OJ要小一些,毕竟各大OJ的题目都偏向竞赛。实际上,我是没有刷过leetcode的。对于如何高效地、事半功倍地刷leetcode,我没有一手的经验的,但我有切更高难度的算法题的经验,这些经验是相通的。

 

而且,我之前也一直有个想法,有些小伙伴们也知道,那就是抽空的时候打算刷完leetcode上的所有的1000道题目。因为我有之前刷OJ的底子,而且leetcode上题目更简单,所以,刷完1000道题目应该不会太久,集中精力3个月?5个月?我觉得应该差不多了。不过这个计划一直被搁浅,因为实在太忙了。明年闲下来一定把这个心事了了。到时候,大家遇到任何刷题的问题,都可以直接留言问我。

 

不过,话说回来,我刷leetcode题是为了帮助大家,而不是为了职场发展。如果你已经工作了,千万别学我,说我也要刷完1000道题目。这对你来说意义不大。因为毕竟混职场靠的不仅仅是算法,可以说算法只是其中很小很小的一方面。只要它不是你的短板就可以了。非得花太多的精力刷完所有的题目,有点太过了。实际上,你只需要把经典的、有代表性的题目刷完,能够应付大部分公司的面试就可以了。

 

今天,就纯属扯闲篇,大家持续关注我的公众号,我会在这里第一时间分享我的刷题计划和进度。