我的魔幻算法刷题之路

0. 我是个菜鸟

我是一名码农,在computer这个农场上辛勤的耕种着自己的农作物——bug。没日没夜用流出的汗水浇灌着它,期待着它健康成长(这农作物有一特点,晚上长的最快)。
我从不生产bug,只是bug搬运工,从最大的种子站——GitHub搬运来我想要的农作物种子,然后把它改造、培养成想要的样子。

首先,我要讲一个故事,至于故事的真伪不用过于纠结。
时间:2020年10月下旬,某月某日某时
地点:公司办公室

事件:
正在写bug的我发现企业微信闪动。一看方知,我的组长(这个公司最大的老板)发来一条信息:“有时间吗,会议室,聊聊?”。
于是,我理了理衣服。然后戴上工卡,怀着忐忑的心,来到了会议室。
组长看到我之后,假惺惺的笑了笑,说:“阿风,最近忙吗?”。
我连忙回复道:“还好,老板。托您的福,一切都在掌控中”。顺便在老板不注意的时候,擦了擦自己额头上那悄悄渗出来的汗液。
“哦,这次找你,是有这么一件事情”,只见他顿了一下,清清嗓子,接着说:“最近公司高层轮岗,这个你也知道。但是呢,高层轮岗的结果往往意味着组织架构的拆分、组合。所以呢,你所在的组织架构被拆了……”。
听到这句话之后,在互联网行业摸打滚爬10年左右的我,察觉到他话语中隐藏着的那句还没说出的事实:你,要,滚,蛋,了!

后面,他说了什么已经完全不记得了。只是清晰的听到他说了一句:“开始刷起来吧”。

没想到,这一天终究还是来了。
于是,我整理好行囊,朝着风刮过的方向,顺时针的梳理了一下头发,踏上了一条刷刷不归路。
在这条路上,充满了各种荆棘,大概有大、中、小三种荆棘。由于那些小荆棘不太起眼,起初我没正眼看他们一眼。走着走着才发现,原来“我是个菜鸟”,那么小的荆棘都刺得我钻心的疼。
看到这里,你知道我在说什么吗?

1. 码农的大型武斗场

众所周知,算法刷题的去处之中,赫赫有名的就是LeetCode(还有牛客网),在这个算法刷题武斗场上有简单、中等、困难三种难度的题型。
到目前为止(截止2021-05-13),大概有2079道题左右。

简单题型:576道
中等题型:1074道
困难题型:429道

在这些题型中,大部分公司面试题型的分布都在简单、中等难度,困难题型则占了很少一部分。
当然,也不排除面试时直接上来就是一道困难难度的算法题(笔者在字节山庄一面时遇到过,直接后会无期、来日方长)。

目前,LeetCode官方对这些题目进行了打标签分类,其标签分类有:36种。

按照所占题数从多到少为:数组、动态规划、字符串、数学、树、深度优先搜索、贪心算法、哈希表、二分查找、广度优先搜索、排序、双指针、回溯算法、设计、位运算、栈、图、链表、堆、递归等。

常考类型:二叉树、数组、字符串、链表、动态规划等。
其中,动态规划最难,难在要找出对应的动态转移方程以及如何进行dp数组的初始化,还有循环的边界条件处理。
有点想说的是,动态规划就像是算法界的脑筋急转弯和高等数学,有时候你会的话,就是会了。不会的话,就很难会(当然有很多题型也是有规律的)。好像不存在什么中间态、临界态(这里允许我做个悲伤的表情,可能是我太菜了,哈哈)。
其他类型一般或多或少会有一定的模板套路。

第一次来到这个码农专属的大型武斗场,我很是懵逼。不知道如何下手、从哪一种类型开始。左看右看想先挑一些简单的题来找找感觉,后来我发现这一想法是多么的天真、幼稚。
对于我这种不生产代码,只是GitHub搬运工的人来说,真的很受伤。因为,找来找去,对于第一次刷题的我来说,最简单的题型都像洪水猛兽一般。

2. 喜获武林秘籍

毫无头绪之后,就是心烦意乱。
心烦意乱之后,就是自我怀疑。

自我怀疑之后,就是为什么活着?

正在我甚是苦恼的时候,旁边的阿花仿佛一眼看穿了我的心思,说道:“阿风,静下心来,看看别人怎么做的”。
正是那句“看看别人怎么做的提醒了我”。
世界如此之大,我现在的烦恼应该也有大佬烦恼过,这些大佬一定会为了后来人写成一些武林秘籍等着我辈取经修炼。

果不其然,GitHub没让我失望。经过搜索,发现了一些关于算法的武林秘籍。

其中,想说的是上面武林秘籍各有千秋。不过《代码随想录》这本秘籍更是按照每一种类型逐个破解、并含有总结分析,很是有用。

得到武林秘籍,按照剧情发展,接下来就是闭关修炼了。
于是,休了东家,回到自己那仅有10平米的山洞,头悬梁锥刺股开始修仙、打怪之路。

3. 小有所成

大约数十日之后
只见山洞之中,有一老者,披头散发坐在一把破椅子上,用力的敲打着手中的键盘,并时不时的发出噼里啪啦的声响,在世人看来他或许想要证明些许什么东西。
过了一会儿,只见他用力的挥舞着双臂欢呼了一声,“嘿,你这道臭算法,终于被我拿下”。

4. 出山一战

又过了数日,大约有两个月左右
他终于决定出山一战。

这第一站就是那个被世人熟知的——字节山庄,此山庄也是众多习码之人心有所向之地。不曾听,有人写诗云云:“字节与心脏,只有一个在跳动”。
此时,老者决定为了胜利献出心脏。
由于先前武林秘籍加持,来到字节山庄之后,很是轻松的过关斩将来到了第三关——boss之战。
boss轻蔑的看了一眼老者,说:“出招吧,看你比我年长,让你三招”。
老者说:“看招”。

几个回合之后,boss说:“回家等通知吧,武林盟主的位置可能是你的!”。
老者十分自信的捋了捋胡须,挥了挥衣袖便下了字节山庄。

5. 路途漫漫

谁曾想,这一等就是数十载
老者,此刻已是老态龙钟,仍旧守在山洞之中等待着有人前来通知他已经成为武林盟主的消息。
可惜,终究是等不起了。

只见,老者扔掉手中秘籍,吃力的缓缓说道:“难道是我漏掉了什么?难道是我不够优秀!”。
等说完这句话之后,便驾鹤西去、羽化升仙。

愿天堂无算法。

6. 尾声

好了,各位看官。
至此,故事已经讲完。想必,你也看到了那几本武林秘籍。孰好孰坏,暂不做定论。如果,你觉得有用,大可可以拿去修炼。

这世间武功千千万,仅修炼一门,即使十分厉害,也难保全面发展。就像每天让你吃鲍鱼,你就设想着可以强身健体、延年益寿一样,也是不太可能。

最后想说的是:
首先,算法很重要毋庸置疑(程序=数据结构+算法)。
其次,算法有点难,也不用怀疑、生畏(算法,归结起来就是一种抽象化的编程思想,掌握了思想、套路,可以以不变应万变)。
最后,并不是会了算法就会了一切,其他知识点也是需要掌握才行。

还有就是,我知道你在看。不要回头了,对,就是说你。按照上面刷题秘籍指引,你修炼数日,定能所成。