去年有段时间一直在刷题,进步神速,解决了以往刷完就忘的问题,这里总结下经验,给有需要的人参考下,核心观点就仨:

1. 打好数据结构与算法基础
2. 多刷题多练习
3. 形成自己的知识体系

        下图是我梳理的知识体系图,和其他人的类似,只是细节有所不同。  看起来很复杂,其实就是一些基础而已。

力扣刷题总结_算法

        大二的时候接触过《数据结构》、《算法》这两门课,教材就是下面那两张图。

力扣刷题总结_时间复杂度_02

力扣刷题总结_知识体系_03

        在学校的时候学的一般,仅仅是了解的程度,以至于第一次面试写个快速排序都没写出来。16年10月初的时候在富士康进行业务部门选择,主管让我写个排序,本想写个快排,写到一半发现不会写,很尴尬,然后写了冒泡。

        再往后是18年在鼎信公司的时候,有个业务场景需要排序,当时写了冒泡排序,虽然能用,但是代码又臭又长。

        19年8月份在准备腾讯面试的时候第一次听说刷题这个东西,然后接触了力扣,当时刷了100多道题,面腾讯的时候遇到的都是基础题,比如归并排序这种。后续基本上就没咋刷题,直到22年的时候想离职了,就又开始刷题,从年初刷到年底,按照代码随想录上面列出的顺序开始刷。我记得最初刷一遍代码随想录需要2~3个月。这一年总共刷了500道题左右。但是没啥用,因为过了一段时间,又不会了。

        23年3月离职后,有了充分的时间,就又重新开始刷题,为啥刷呢,因为我觉得数据结构和算法很重要,无论是面试或者工作中处理问题,都需要很强的数据结构与算法能力。虽然说解决工作问题的方案有很多种,但是不同的方案效率是不一样的,有些方案时间复杂度O(n^2),有些是O(logn),还有的是O(n),也有可能是O(1),可能有些同学不在乎,觉得只要解决问题就行。但在复杂业务场景下,不同的方案带来的效率是不可相同并论的,比如说有10亿个有序数字,检查某个数字是否存在,如果遍历的话,时间复杂度是O(n),也就是说要执行10亿次判断,如果采用二分算法,时间复杂度是O(logn),约等9次判断。一个是10亿次执行,一个是9次执行。差了好几个数量级。看上去只是数字的差别,但考虑到系统执行时长、系统执行耗费的计算资源,包括磁盘损耗、电力损耗等等。不同算法带来的效益相差很大,有人说一个优秀的程序员能顶10个普通程序员。我觉得这话不对,优秀的程序员能顶几百、几千个、上不封顶。

        23.5月~6月 花了一些时间把B站王卓老师的《数据结构与算法基础》系列课程看完了,期间着重练习了图论相关的算法,8月花了三周左右专门练习动态规划算法,为此还充了一年力扣会员,9月份专门刷专项和Hot100、Hot150,第一次刷完Hot100耗时两周左右,第二次刷完耗时一周,就这么一直刷到月底。在这一阶段我对数据结构和算法基本上有了一个清晰的认识,知道了它们各自的构成都有哪些,长啥样。在此基础上做了一个知识梳理,就是上图。

        刷题的关键在于理解,不要死记硬背。我记得最初接触KMP算法,光是理解它就用了1周,后面学习马拉车算法也用了2周。从23年底到24年中,为了保持面试的手感,这期间一直在刷Hot100,前前后后刷了20多遍,基本上一小时20~30道题。在此期间面试遇到的算法题都是秒杀,不会像以前那样,这个不会那个不会。

力扣刷题总结_时间复杂度_04

        总结我的经验,要想刷好题,基础很重要。万丈高楼平地起,没有基础,终究是不长久的。除此之外还要加上大量的练习,通过练习来加深自己对数据结构和算法的理解,纸上得来终觉浅,绝知此事要躬行。有了基础和练习,再进一步思考自己对DS的理解,形成自己的知识体系,这样后续遇到问题,就不会手忙脚乱。

        以上就是个人的刷题总结,欢迎大家指教。