许多程序员对算法望而生畏,认为算法是一门高深莫测的学问。

以前我曾经面试过一个求职者,起初考查他的技术功底和项目经验,他都回答得不错。接下来我对他说:“OK,那我考查一下你的算法水平吧。”

题目还没说出口,该求职者立马摆摆手说:“不要不要,我算法不行的!”

我还是有些不甘心,接着说道:“我只考查最基础的,你说说冒泡排序的基本思路吧!”

他仍旧说:“我不知道,我算法一点都不会……”

算法真的那么难,真的那么无趣吗?

恰恰相反,算法是编程领域中最有意思的一块内容,也不像许多人想象的那样难以驾驭。

许多人把算法比作程序员的“内功”,但笔者觉得这个比喻并不是很恰当。内功实实在在,没有任何巧妙可言,而算法天马行空,千变万化,就像金庸笔下令狐冲的一套独孤九剑。

学习算法,我们不需要死记硬背那些冗长复杂的背景知识、底层原理、指令语法……需要做的是领悟算法思想、理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。

我一直希望写出一些东西,让更多的IT同行能够领略到算法的魅力,可是用什么方式来写呢?

2016年9月,一次突如其来的灵感让我创造了一个初出茅庐的菜鸟程序员形象,这个菜鸟程序员名叫小灰。

程序员小灰的故事活跃在同名的微信公众号上,该公众号用漫画的形式诉说着小灰一次又一次的面试经历,倔强的小灰屡战屡败,屡败屡战。小灰是我刚刚入行时的真实写照,相信许多程序员也能从中看到自己的影子。

终于,在朋友们的支持和鼓励下,程序员小灰的故事从微信公众号搬到了纸质图书上。能让更多同行看到小灰的故事,我感到十分欣慰。

本书特色

这本书通过漫画的形式,讲述了小灰学习算法和数据结构知识的心路历程。书中许多内容源于本人的微信公众号,但是比公众号上所展现的内容更加系统、全面,也更加严谨。

本书的前4章是对算法基础知识的讲解,没有算法和数据结构基础的读者可以从头开始进行系统学习。

对于有一定基础的读者,也可以选择从第5章面试题的讲解开始阅读,每一道面试题目都是相对独立的,并不需要严格地按顺序学习。同时,也推荐大家适当看看前面的内容,巩固一下自己的算法知识体系。

这不是一本编程入门书。在编程方面完全零基础的读者,建议至少先了解一门编程语言。

这也不是一本局限于某个编程语言的书,虽然书中的代码示例都是用Java来实现的,但算法思想是相通的。在实现代码时,书中尽可能规避了Java语言的特殊语法和工具类,相信熟悉其他语言的开发者也不难看懂。

勘误和支持

除书中所提供的代码示例以外,大家也可以关注微信公众号“程序员小灰”,在后台回复“漫画算法”,获得全书完整的、可运行的代码。为了保证代码的简洁,在部分代码实现中省略了烦琐的参数判空和验证逻辑。

由于作者水平有限,书中难免会出现一些错误,恳请广大读者批评指正。读者如果在阅读过程中产生疑问或发现Bug,欢迎随时到微信公众号的后台留言。“程序员小灰”微信公众号二维码如下。

致谢

感谢微信公众号“程序员小灰”的读者。你们的鼓励和支持,给了我坚持创作的动力。

感谢成都道然科技有限责任公司的姚新军老师。有了他的肯定、支持和指导意见,才有了这本书的正式出版。

感谢朴提、单耳和康慧三位插画师所画的精彩插画,是你们让小灰的形象更丰满、更可爱。感谢为本书审稿的杨道谈先生,感谢为本书写序的李烨老师,感谢在百忙之中阅读书稿并写书评的专家们,他们是刘欣、张洪亮、安晓辉、李艳鹏、翟永超等。

特别感谢我的父母,是他们把我带进了数学的大门。在我上小学的时候,是他们的坚持,才让我有机会学习奥数,参加数学竞赛,并对数学和逻辑产生了兴趣。在这本书的写作过程中,又是他们辛苦努力屏蔽生活琐事对我的干扰,让我能够全身心地投入到本书的写作当中。

谨以此书献给我的家人,我的读者,以及热爱编程的朋友们!

魏梦舒,微信公众号“程序号小灰”的作者