共计 3108 个字符,预计需要花费 8 分钟才能阅读完成。
———–
之前发的那篇对于框架性思维的文章,我也发到了不少其余圈子,受到了大家的广泛好评,这一点我真的没想到,首先感激大家的认可,我会更加致力,写出通俗易懂的算法文章。
有很多敌人问我数据结构和算法到底该怎么学,尤其是很多敌人说本人是「小白」,感觉这些货色好难啊,就算看了之前的「框架思维」,也感觉本人刷题乏力,心愿我能聊聊我从一个非科班小白一路是怎么学过来的。
首先要给怀有这样疑难的敌人鼓掌,因为你当初曾经「晓得本人不晓得」,而且开始尝试学习、刷题、寻求帮忙,能做到这一点自身就是及其艰难的。
对于「框架性思维」,对于一个小白来说,可能临时无奈齐全了解(如果你能了解,阐明你程度曾经不错啦,不是小白啦)。就像软件工程,对于我这种没带过我的项目的人来说,感觉其内容枯燥乏味,全是废话,然而对于一个带过团队的人,他就会感觉软件工程里的每一句话都是精髓。临时不太了解没关系,留个印象,功夫到了很快就明确了。
上面写一写我一路过去的一些教训。如果你曾经看过很多「如何高效刷题」「如何学习算法」的文章,却还是没有开始口头并坚持下去,本文的第五点就是写给你的。
我感觉之所以有时候认为本人是「小白」,是因为常识某些方面的空白造成的。具体到数据结构的学习,无非就是两个问题搞得不太分明:这是啥?有啥用?
举个例子,比如说你看到了「栈」这个名词,老师可能会讲这些关键词:先进后出、函数堆栈等等。然而,对于初学者,这些形容属于文学词汇,没有理论价值,没有解决最根本的两个问题。如何答复这两个根本问题呢?答复「这是啥」须要看教科书,答复「有啥用」须要刷算法题。
一、这是啥?
这个问题最容易解决,就像一层窗户纸,你只有轻易找本书看两天,本人入手实现一个「队列」「栈」之类的数据结构,就能捅破这层窗户纸。
这时候你就能了解「框架思维」文章中的前半部分了:数据结构无非就是数组、链表为骨架的一些特定操作而已;每个数据结构实现的性能无非增删查改罢了。
比如说「列队」这个数据结构,无非就是基于数组或者链表,实现 enqueue 和 dequeue 两个办法。这两个办法就是增和删呀,连查和改的办法都不须要。
二、有啥用?
解决这个问题,就波及算法的设计了,是个持久战,须要常常进行形象思考,刷算法题,造就「计算机思维」。
之前的文章讲了,算法就是对数据结构精确而奇妙的使用。罕用算法问题也就那几大类,算法题无非就是一直变换场景,给那几个算法框架套上不同的皮。刷题,就是在锤炼你的目力,看你能不能看穿问题表象揪出相应的解法框架。
比如说,让你求解一个迷宫,你要把这个问题层层形象:迷宫 -> 图的遍历 -> N 叉树的遍历 -> 二叉树的遍历。而后让框架领导你写具体的解法。
形象问题,直击实质,是刷题中你须要刻意造就的能力。
三、如何看书
间接举荐一本公认的好书,《算法第 4 版》,我个别简写成《算法 4》。不要走马观花,这本书你能选择性的看上 50%,基本上就达到平均水平了。别怕这本书厚,因为起码有三分之一不必看,上面讲讲怎么看这本书。
看书依然遵循递归的思维:自顶向下,逐步求精。
这本书常识结构合理,解说也分明,所以能够按程序学习。书中注释的算法代码肯定要亲自敲一遍,因为这些真的是扎实的根底,要认真了解。不要认为本人看一遍就看懂了,不入手的话了解不了的。然而,结尾局部的根底能够酌情跳过;书中的数学证实,如不影响对算法自身的了解,齐全能够跳过;章节最初的练习题,也能够全副跳过。这样一来,这本书就薄了很多。
置信读者当初曾经认可了「框架性思维」的重要性,这种看书形式也是一种框架性策略,抓大放小,着重了解整体的常识架构,而疏忽证实、练习题这种细节问题,即 放弃本人对新常识的好奇心,防止陷入有限的细节被劝退。
当然,《算法 4》到前面的内容也比拟难了,比方那几个驰名的串算法,以及正则表达式算法。这些属于「经典算法」,看集体承受能力吧,单说刷 LeetCode 的话,根本用不上,不自量力即可。
四、如何刷题
首先申明一下,算法和数学程度没关系,和编程语言也没关系,你爱用什么语言用什么。算法,次要是造就一种新的思维形式。所谓「计算机思维」,就跟你考驾照一样,你以前骑自行车,有一套自行车的规定和技巧,当初你开汽车,就须要适应并练习开汽车的规定和技巧。
LeetCode 上的算法题和后面说的「经典算法」不一样,咱们姑且称为「解闷算法」吧,因为很多题目都比拟乏味,有种在做奥数题或者脑筋急转弯的感觉。比如说,让你用队列实现一个栈,或者用栈实现一个队列,以及不必加号做加法,开脑洞吧?
当然,这些问题尽管看起来无厘头,理论生存中也用不到,然而想解决这些问题仍然要靠数据结构以及对基础知识的了解,兴许这就是很多公司面试都喜爱出这种「智力题」的起因。上面说几点技巧吧。
尽量刷英文版的 LeetCode,中文版的“力扣”是阉割版,不仅很多题目没有答案,而且连个讨论区都没有。英文版的是真的很良心了,很多问题都有官网解答,具体易懂。而且讨论区(Discuss)也积淀了大量优质内容,甚至好过官网解答。真正能关上你思路的,很可能是讨论区各路大神的思路荟萃。
PS:如果有的英文题目切实看不懂,有个小技巧,你在题目页面的 url 里加一个 -cn,即 https://leetcode.com/xxx 改成 https://leetcode-cn.com/xxx,这样就能切换到相应的中文版页面查看。
对于初学者,强烈建议从 Explore 菜单里最上面的 Learn 开始刷,这个专题就是专门教你学习数据结构和根本算法的,教学篇和相应的练习题联合,不要太良心。
最近 Learn 专题里新增了一些内容,咱们挑数据结构相干的内容刷就行了,像 Ruby,Machine Learning 就没必要刷了。刷完 Learn 专题的根底内容,根本就有能力去 Explore 菜单的 Interview 专题刷面试题,或者去 Problem 菜单,在真正的题海里漫游了。
无论刷 Explore 还是 Problems 菜单,最好一个分类一个分类的刷,不要走马观花。比如说这几天就刷链表,刷完链表再去连刷几天二叉树。这样做是为了帮忙你提取「框架」。一旦总结出针对一类问题的框架,解决同类问题堪称是手到擒来。
五、情理我都懂,还是不能坚持下去
这其实无关算法了,还是陈词滥调的执行力的问题。不说什么破鸡汤了,我感觉 解决办法就是「激发欲望」,留神我说的是欲望,而不是常说的趣味,拿我本人说说吧。
半年前我开始刷题,目标和大部分人都一样的,就是为毕业找工作做筹备。只不过,大部分人是等到邻近毕业了才开始刷,而我离毕业还有一阵子。这不是夸耀我多有觉醒,而是我抵赖本人的极度平庸。
首先,我真的想找到一份不错的工作(谁都想吧?),我想要高薪呀!否则我在敌人背后,女神背后放下的骚话,最终都会反过来啪啪地打我的脸。我也是要恰饭,要面子,要虚荣心的嘛。赚钱,虚荣心,足以激发我的欲望了。
然而,我不善于 deadline 突击,我了解货色真的慢,所以罗唆笨鸟先飞了。智商不够,拿工夫来补,我没能力两个月突击,罗唆拉长阵线,打他个两年游击战,我还不信耗不死算法这个强敌。事实证明,你如果认真学习一个月,就可能获得肉眼可见的提高了。
当初,我仍然在保持刷题,而且为了另外一个起因,这个公众号。我没想到本人的文字居然可能帮忙到别人,甚至能失去认可。这也是虚荣心啊,我不能让读者悲观啊,我想让更多的人认可(夸)我呀!
以上,不光是保持刷算法题吧,很多场景都实用。执行力是要靠「欲望」撑持的,我也是一凡人,只有那些看得见摸得着的货色能力使我高兴呀。读者无妨也尝试把刷题学习和本人的切身利益分割起来,这恐怕是坚持下去最简略直白的理由了。