程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

自序

我能出书挺意外的。

虽然我早就知道想进入那些大公司要靠“刷”代码面试题来练习编写代码的能力,可是在6年前的某一天,我突然有了心情去看代码面试题长什么样子,于是收集了代码面试的题目。了解得越深入,我就越有一种恐慌的感觉,因为感觉自己什么都不太在行,对一个归并排序(Merge sort)写出完整的代码都感觉挺费劲的,面对这个冯·诺依曼发明的排序算法,我真的有底气说自己是计算机专业的学生吗?这种打击并没有持续太久,因为爱耍小聪明的人总会特别自信。我决定开始认真面对“刷”题这件事,但那时我根本不知道我即将面对什么,更不会有写书的念头。

我把课余时间利用起来,心想:不就是“刷”题吗?别人能写出来,咱也能写出来。起初的心态是我不服,我就想告诉自己能行。过程虐心是肯定的,经常半夜因为看到一个复杂度特别低的算法自己真的不能理解而沮丧地睡不着觉。当时觉得找不到资料能彻底让我明白,书上讲得太粗浅,网上讲的太散乱,代码写得看不懂。起初我“刷”题的时候无数次地想放弃,因为觉得这些都是什么玩意儿!我为什么放着好好的日子不过,去找这种罪受?可是我又不甘心,虽然我不懂很多解法,但是我觉得它们真的很有意思。

我将能买到的所有相关书籍上的所有题目全都研究了一遍,无论是中文的还是英文的,我都硬着头皮“啃”。写完每道题后,我都和书上的方法进行反复对比。“啃”完了五六本书之后,距离我刚开始“刷”题已经过去16个月了。写书?别逗了,才刚看完。

“年轻人总会找借口说这个东西不是我感兴趣的,所以做不好是应该的。但他们没有注意的是,你面对的事情中感兴趣的事情总是少数,这就使得大多数时候你做事情的态度总是很懈怠、很消极,这使你变成了一个懈怠的人。当你真正面对自己感兴趣的东西时,你发现你已经攥不紧拳头了。”时常想起本科时的毕业设计指导老师——高鹏义老师说的这段话。说得对!对一个东西,如果你没有透彻研究过,就不要轻易说它不精彩。这不是博爱,而是对自己认真。

“刷”题代码达到 4 万行的时候,我基本上成了国内外所有热门“刷”题网站的日常用户,此时我确认了一件事情,今天的代码面试指导真的处在一个很初级的阶段,这种不健全是全方面的。

例如:

● 经常看到一篇文章前后的语境是割裂的,作者经常根据之前的一个优良解法提出更好的优化方式,但整篇文章都不提及之前的解法是什么。这就导致初学者根本无法看懂。

● 几乎所有的书籍都忽略例子带来的引导作用,甚至还有不少书籍在阐述一个解法的时候只写伪代码,这就使得读者在看懂意思和自己真正能写出代码之间其实还有很多的路要走。

● 代码面试题目的特点是“多”“杂”“难”,从着手开始学习到最终达到自己想要的效果之间,自己对自己的评估根本无从谈起。“慢慢练吧,学海无涯”成为主要的心态,这就难免会产生怀疑的情绪。

● 看见一道新的面试题时还是会无从下手,因为之前的学习无法做到举一反三,对自己做过的题目缺乏总结和归纳。

难道“刷”题真的只适合“聪明人”?我不这么看,既然大多数内容处在有待商榷的阶段,那我就去学习原论文吧。

记得当时我一个人在国外,在初冬的一个下午,“刷”题已经两年之久,快吃晚饭的时候,我突然想起自己忘了吃午饭,就冲出家门去觅食。站在7-11门前的广场上,我拿着1.5美元的热狗和75美分的咖啡,微温的阳光撒在身上,远远地望着即将消失的太阳。我停下来,把咖啡放在斑驳的石头台子上,手里的热狗挺好看,香肠和洋葱都挺新鲜,清冷的空气吹过来,却让我的心绪更乱。旧金山的天空五彩斑斓,让漂泊者头晕目眩。哭得跟个鬼似的我除了想家,哪里敢设想自己会出书呢?

当我意识到在网上很难搜索到新鲜的题目时,我已经换了两家公司,反复实现了 600多道题目,编写了差不多10万行代码。原来只是为了找份工作“刷”题这一初心早就忘了,而变成了兴趣并坚持了这么久,我自己也感到意外。更奇怪的是,我已经完全乐在其中,同时交流欲望越来越强,时常和同事们展开这方面的讨论。我发现很多书上的解法不是最优,很多题目其实和同事们讨论的做法更好,可以发现高手特别多,但好像都懒得动笔。

有一天,我看到自己写的题目,想到自己那些“抓心挠肝”的日子,突然觉得要不出书吧?我已经离不开这种感觉了,如果这不是真爱,那什么才是呢?

这不是一个励志的故事,是一个爱“刷”题的人决定把很多最优解讲出来的过程,就这么简单。

左程云

2015年7月20日