这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!
本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化。书中将所有的面试题从难到易依次分为“将、校、尉、士”四个档次,方便读者有针对性地选择“刷”题。本书所收录的所有面试题都给出了最优解讲解和代码实现,并且提供了一些普通解法和最优解法的运行时间对比,让读者真切地感受到最优解的魅力!
本书中的题目全面且经典,更重要的是,书中收录了大量独家题目和最优解分析,这些内容源自笔者多年来“死磕自己”的深入思考。
码农们,你们做好准备在IT名企的面试中脱颖而出、一举成名了吗?这本书就是你应该拥有的“神兵利器”。当然,对需要提升算法和数据结构等方面能力的程序员而言,本书的价值也是显而易见的。
程序员刷题宝典!编程能力提升秘笈!精选IT名企真实代码面试题,大量独家题目及最优解分析,全面覆盖算法与数据结构题型!
【自 序】
我能出书挺意外的。
在6年前的某一天,虽然我早就知道想进入那些大公司要靠“刷”代码面试题来练习编写代码的能力。可是这一天却不止如此,我突然有了心情去看代码面试题长什么样子,于是收集了代码面试的题目,越深入,我越有一种恐慌的感觉,因为感觉自己什么都不太在行,对一个归并排序(Merge sort)写出完整的代码都感觉挺费劲的,面对这个冯?诺伊曼发明的排序算法,我真有底气说自己是计算机专业的学生吗?这种打击并没有持续太久,因为爱耍小聪明的人总会特别自信。我决定开始认真面对“刷”题这件事,但那时我根本不知道我即将面对什么,更不要谈有写书的念头。
我把课余时间利用起来,心想:不就是“刷”题吗?别人能写出来,咱也能写出来。起初的心态是我不服,我就想告诉自己能行。过程虐心是肯定的,经常半夜因为看到一个复杂度特别低的算法自己真的不能理解而沮丧地睡不着觉。当时觉得找不到什么资料能彻底让我明白,书上讲得太粗浅,网上的太散乱,代码写得看不懂。起初我“刷”题的时候无数次地想放弃,因为觉得这些都是什么玩意儿!我为什么放着好好的日子不过,去找这种罪受?可是我又不甘心,虽然我不懂很多解法,但是它们真的很有意思。
我将能买到的所有相关书籍上的所有题目全都研究了一遍,不管是中文的还是英文的,我都硬着头皮“啃”。写完每道题后,我都和书上的方法进行反复对比。“啃”完了五六本书之后,距离我刚开始“刷”题已经过去16 个月了。写书?别逗了,才刚看完。“年轻人总会找借口说这个东西不是我感兴趣的,所以我做不好是应该的。但他们没有注意的是,你面对的事情中感兴趣的事情总是少数,这就使得大多数时候你做事情的态度总是很懈怠、很消极,这使你变成了一个懈怠的人。当你真正面对自己感兴趣的东西时,你发现你已经攥不紧拳头了。”时常想起本科时的毕业设计指导老师——高鹏义老师说的这句话。说得对!对一个东西,如果你没有透彻研究过,不要轻易说它不精彩。这不是博爱,而是对自己认真。
“刷”题代码达到4万行的时候,我基本上成了国内外所有热门“刷”题网站的日常用户,此时我确认了一件事情,今天的代码面试指导真的处在一个很初级的阶段,这种不健全是全方面的。
例如:
? 经常看到一篇文章前后的语境是割裂的,作者经常根据之前的一个优良解法提出更好的优化方式,但整篇文章都不提之前的解法是什么。这就导致初学者根本无法看懂;
? 几乎所有的书籍都忽略例子带来的引导作用,甚至还有不少书籍在阐述一个解法的时候只写伪代码,这就使得读者在看懂意思和自己真正能写出代码之间其实还有很多的路要走;
? 代码面试题目的特点是“多”、“杂”、“难”,从着手开始学习到最终达到自己想要的效果之间,自己对自己的评估根本无从谈起。“慢慢练吧,学海无涯”成为主要的心态,这就难免会产生怀疑的情绪;
? 看见一道新的面试题时还是会无从下手,因为之前的学习无法做到举一反三,对自己做过的题目缺乏总结和归纳。
难道“刷”题真的只适合聪明人玩?我不这么看,既然大多数内容处在有待商榷的地步,那我就去学习原论文吧。
当时一个人在国外,记得在初冬的一个下午,“刷”题已经两年之久,快吃晚饭的时候,我突然想起自己忘了吃午饭,就冲出家门去觅食。站在7-11门前的广场上,我拿着1.5美元的热狗和75美分的咖啡,微温的阳光撒在眼睛里,远远地望着即将消失的一天。我停下来,把咖啡放在斑驳的石头台子上,手里的热狗挺好看,香肠和洋葱都挺新鲜,清冷的空气吹过来,却让我的心绪更乱。旧金山的天空五彩斑斓,让漂泊者头晕目眩。哭得跟个鬼似的我除了想家,哪里敢想自己会出书呢?
当我意识到在网上很难搜到新鲜的题目时,我已经换了两家公司,反复实现了600多道题目,写了差不多10万行代码。原来只是为了找份工作而“刷”题这一初心早就忘了,变成了兴趣并坚持了这么久,我自己也感到意外。更奇怪的是,我已经完全乐在其中,同时交流欲望越来越强,时常和同事们展开这方面的讨论。发现很多书上的解法不是最优,很多题目其实和同事们讨论的做法更好,发现高手特别多,但好像都懒得动笔。
有一天,我看到自己写的题目,想到自己那些抓心挠肝的日子,突然觉得要不出书吧?我已经离不开这种感觉了,如果这不是真爱,那什么才是呢?
这不是一个励志的故事,是一个爱“刷”题的人决定把很多最优解讲出来,就这么简单。
左程云
2015年7月20日
图片9-21中后面的str[i]应该是str[j]