CSDN话题挑战赛第1期
活动详情地址:https://marketing.csdn/p/bb5081d88a77db8d6ef45bb7b6ef3d7f
参赛话题:Leetcode刷题指南
话题描述:代码能力是一个程序员的基本能力,而除了做项目之外,大家接触到的最常规的提升代码能力的方法基本就是刷题了,因此,加油刷题,冲刺大厂!
创作模板:Leetcode刷题指南


虽然题目是刷题指南,但实际上这是一篇面向新手的,主要讲如何比较系统地学习数据结构和算法的文章。就我个人来说,刷题(leetcode)还是为了掌握和巩固数据结构和算法这些理论知识,也就是:刷题起到的是辅助作用,目的还是为了掌握数据结构和算法。所以这篇文章提供的方法是为了在较长的一段时间内系统地学习数据结构和算法的相关知识,而不是短时间内为了找工作而有侧重地刷题。之所以题目叫刷题指南,而不是"数据结构和算法自学指南",一方面是考虑到放到了LeetCode相关的专栏里;另一方面是判断是否掌握了数据结构的理论知识,还是要看刷题这一实践环节。

首先,学习数据结构肯定是要掌握一门编程语言的:java,python,c++等(只要leetcode支持就行)。那么问题来了,怎么才叫掌握一门编程语言?就刷题来说,能够使用这门语言表达基本逻辑即可;细致一点儿的话:知道基本的语法,会使用基本操作符,和内置类型的基本操作即可。以python为例,你知道if while for 函数怎么用;知道算数运算(±*/%),逻辑运算(and or not),位运算( >> << ~& | ^ )),会使用基本类型(list set dict str等)的相关操作;最后再了解一点儿类的相关知识,不用多,知道成员变量和成员函数如何使用即可。如果基本上能掌握我列举出来的这些,对于刷题来说,我觉得就已经足够了,可以算是掌握这一门语言了。当然,实际刷的时候还会用到内置函数以及官方库,这些东西比较杂乱,没必要单独拿出来学,所以碰到哪个学哪个就行。如果仍然是一门编程语言都不会的话,可以试试python。好处就是相较于其它的语言,python学起来要更简单一些。也有一些缺点,比如对于理解算法的复杂度不太友好。但是我觉得既然处在一个几乎什么也不会的阶段,还是应该以尽快上手为主,等有一定的基础后再深入。

满足了我上面说的掌握一门编程语言的条件后,就可以正式开始了。上面提到的,刷题的主要目的之一就是掌握并活用理论。如果本身就不了解理论,刷题会很吃力,因为这种情况下做题没有方法可循,能做出来基本就是靠“拍脑袋“。硬要这么刷一段时间的话,或许也能自己悟出点儿什么,但是远不如先扎实理论,再刷题巩固效果明显。

所以如果不具备理论基础,我觉得还是不要急着刷题,先打好基础再说。打基础这其实也算是一个烂大街的问题了,搜索 “如何自学数据结构和算法“ 可以看到很多方法。大家也可以自行选择一个自己认为靠谱的方法。我本身也是自学入门的,原本的专业是通信/电子类的,大一开过一年的计算机基础学习c++,学得还可以,算是满足我前面提到的掌握一门编程语言吧。从大三开始有了跨考计算机的想法,然后就开始自学数据结构,大概分为了三个阶段:

1)大三上学期开始看《大话数据结构》并使用c++实现书中的代码。

2)大三暑假开始,到考研初试:《王道》和严蔚敏的《数据结构》教材,外加手写了50多页的代码(A4纸正反面书写)。

3)大四考研初试结束后,到研究生入学后的一段时间:刷leetcode,看《算法导论》和《挑战程序设计竞赛》

显然,我上面提到的三个阶段肯定是不适合拿来直接用的,尤其是这个手写代码,真的一半程度上都是为了应试。所以,我稍微改了一下第二条并添加了更多的解释细节,自认为对初学者还是比较适用的,所以下面就是本文的主题了,如何通过刷题,循序渐进地学习理论知识。:

1)第一阶段:自学《大话数据结构》,同时实现书中的算法。这本书真的是面向初学者的,有比较丰富的图示,通俗易懂。但是正是因为通俗,看过一遍后可能就会有已经掌握了的错觉,所以建议亲手实现一遍书中的算法。当然通俗是相较于高校课本来说的,如果之前没有一点儿基础,碰上一些知识点理解不了也是很正常的。说的具体一点儿:前边线性表可能很好理解,但是到了树的部分,很可能就会碰到第一道坎儿——递归。众所周知:世上只有两类程序员:懂递归的和不懂递归的。所以想入门,递归是必须要掌握的。如果碰上不懂的部分,除了动手实际操作练习以为,还可以查看额外的资料,或许就会碰上更适合你的书或者资料。

亲手实现算法的另一个好处是培养程序执行时的思维模式,所以到树,图的部分,虽然算法比较复杂,但是也要亲手实现一遍。而且出了bug,一定要亲手调一调。所以还要尽早地掌握debug的方法。拿python来说,pdb怎么用学一学是很有好处,实在不行print也能凑活着用,总之就是bug一定要耐心调。


2)做leetcode简单题和部分中档题,并使用严的教材作为补充。第一阶段使用《大话数据结构》可以说是给了我们对数据结构和算法一个十分直观的理解,虽然亲手实现了一遍算法,但是仍需进一步掌握和理解。我之前出于应试的需要,所以手写代码,但是大家是完全没有必要。所以这一阶段推荐刷一些leetcode中的简单的题和中等难度的题来代替手写代码。刷的时候按书中章节来刷,对如想刷树这一部分,那就把树相关的习题挑出来,集中刷。多说一点:有些题虽然标的简单但是可能比很多中等的题要难,所以碰上了做不出的,心态也不要崩,换下一道就好了。不需要追求刷的题的数量,我个人感觉一个章节能做个十来道,就当前阶段来说就已经不错了。

然后是,为什么说最好看看严的教材。还是要回到《大话数据结构》的问题上来,这本书为了直观和通俗,省略或者简写了一些比较晦涩,但是又比较重要的知识和经典用例。比如说树的非递归遍历,栈的一些经典用例,这些我觉得都是很值得了解和掌握的。这种时候就需要有一本书来作为补充,所以选了严的教材。严的教材确实需要沉下心来认真看,能看进去一定会很大收获的。而且考虑到已经有了一定的基础,应该会容易不少。这本书本身是补充作用,无需从头到尾的看,看和《大话数据结构》中相关的章节即可。


3)第三阶段。经过一波刷题和严的教材的补充,我觉得已经基本算是入门了。这之后就需要学一些进阶的内容了,比如说动态规划和贪心算法,这些在之前的教材中是没有教过的。方法还是一样,先学理论再刷题。我先推荐一个吓人的:《算法导论》。当然我也不装B,说实话,我只看过:1-4章、15章和16章。前三章不说,第四章讲分治,15章讲动态规划,16章讲贪心算法,真的是讲地明明白白。网上讲动态规划的不少,说句实话,很多都有《算法导论》的影子。我觉得,与其获得别人的二手知识,不如好好把这几章认真研读一遍。所以,对于动态规划和贪心算法,很推荐读一读《算法导论》的这几章。

之后是《挑战程序设计竞赛》这本书。Leetcode里边hard难度的题,以及一部分中等难度的题,单靠数据结构的部分真的不够,比如说线段树,根本不知道这玩意儿,自然也用不出来,遇到需要这个结构的题,妥妥超时。再比如说二分查找,深度优先搜索,数据结构书上讲的那点都知道怎么回事儿,但换一个其它的问题可能就会想不到要怎么用这些方法。所以还是要系统地学习这一块儿的理论知识。而这本《挑战程序设计竞赛》就是一本面向算法竞赛初学者的教材。我个人认为这本可以对标数据结构部分的《大话数据结构》,也是一本相对通俗的书。有了《算法导论》那几章,还有《挑战程序设计竞赛》这本书的理论支持外,这一阶段刷的题就是中等难度和hard难度的题了。刷法还是按照章节来,想刷动态规划,那就把所有的动态规划的题集中起来刷。


以上就是本文的主要内容了。因为leetcode中的题是按照章节刷的,所以第一二个阶段可以同时推进:看完《大话数据结构》中的一个章节,复现代码后,就可以用严的教材为辅助去刷leetcode中对应章节的题了。整体上,如果从头开始的话,整体上就是:打基础,巩固基础,进阶;一天两到三个小时的话,三个月应该能搞完。实际上根据自己的具体情况可能更快。比如之前学过数据结构,但是比较水或者忘了不少,那就可以边复习自己的课本,边刷一部分简单题和中等题,之后再谈进阶;那如果本身数据结构就不错,那就可以直接到第三步,学学书上的理论,直接就刷起来就行了。


CSDN话题挑战赛第1期
活动详情地址
:https://marketing.csdn/p/bb5081d88a77db8d6ef45bb7b6ef3d7f

更多推荐

LeetCode刷题指南