描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111607793
在这里,有面试笔试常见技巧的提炼与总结;
在这里,有面试笔试高频算法知识点的整理与剖析;
在这里,有面试笔试历年算法真题的解答与拓展。
本书是一本讲解程序员面试笔试算法的书,代码采用Python语言编写,书中除了讲解如何解答算法问题以外,还引入了例子辅以说明,让读者更容易理解。
本书几乎将程序员面试笔试过程中算法类真题一网打尽,在题目的广度上,通过各种渠道,搜集了近3年来几乎所有IT企业面试笔试算法的高频题目,所选择题目均为企业招聘使用题目。在题目的深度上,本书由浅入深,庖丁解牛式地分析每一个题目,并提炼归纳。同时,引入例子与源代码、时间复杂度与空间复杂度的分析,这些内容是其他同类书籍所没有的。本书根据真题所属知识点进行分门别类,结构合理,条理清晰,对于读者进行学习与检索意义重大。
本书可作为计算机相关专业毕业生面试笔试的求职用书,也可以作为本科生、研究生学习数据结构与算法的辅导书籍,同时适合期望在计算机软硬件行业大显身手的计算机爱好者阅读。
前言
面试笔试经验技巧篇
经验技巧1 如何巧妙地回答面试官的问题2
经验技巧2 如何回答技术性的问题3
经验技巧3 如何回答非技术性问题4
经验技巧4 如何回答快速估算类问题5
经验技巧5 如何回答算法设计问题6
经验技巧6 如何回答系统设计题9
经验技巧7 如何解决求职中的时间冲突问题11
经验技巧8 如果面试问题曾经遇见过,是否要告知面试官12
经验技巧9 被企业拒绝后是否可以再申请12
经验技巧10 如何应对自己不会回答的问题13
经验技巧11 如何应对面试官的“激将法”语言14
经验技巧12 如何处理与面试官持不同观点这个问题15
经验技巧13 关注职场暗语15
面试笔试真题解析篇
第1章 链表21
1.1 如何实现链表的逆序22
1.2 如何从无序链表中移除重复项26
1.3 如何计算两个单链表所代表的数之和29
1.4 如何对链表进行重新排序32
1.5 如何找出单链表中的倒数第k个元素35
1.6 如何检测一个较大的单链表是否有环39
1.7 如何把链表相邻元素翻转41
1.8 如何把链表以K个结点为一组进行翻转43
1.9 如何合并两个有序链表46
1.10 如何在只给定单链表中某个结点的指针的情况下删除该结点49
1.11 如何判断两个单链表(无环)是否交叉51
1.12 如何展开链接列表54
第2章 栈、队列与哈希57
2.1 如何实现栈57
2.2 如何实现队列60
2.3 如何翻转栈的所有元素64
2.4 如何根据入栈序列判断可能的出栈序列68
2.5 如何用O(1)的时间复杂度求栈中小元素71
2.6 如何用两个栈模拟队列操作73
2.7 如何设计一个排序系统74
2.8 如何实现LRU缓存方案76
2.9 如何从给定的车票中找出旅程77
2.10 如何从数组中找出满足a b=c d的两个数对79
第3章 二叉树81
3.1 二叉树基础知识81
3.2 如何把一个有序整数数组放到二叉树中83
3.3 如何从顶部开始逐层打印二叉树结点数据84
3.4 如何求一棵二叉树的子树和87
3.5 如何判断两棵二叉树是否相等89
3.6 如何把二叉树转换为双向链表90
3.7 如何判断一个数组是否是二元查找树后序遍历的序列93
3.8 如何找出排序二叉树上任意两个结点的近共同父结点94
3.9 如何复制二叉树101
3.10 如何在二叉树中找出与输入整数相等的所有路径102
3.11 如何对二叉树进行镜像反转104
3.12 如何在二叉排序树中找出个大于中间值的结点106
3.13 如何在二叉树中找出路径的和107
3.14 如何实现反向DNS查找缓存109
第4章 数组112
4.1 如何找出数组中的重复元素112
4.2 如何查找数组中元素的值和小值118
4.3 如何找出旋转数组的小元素121
4.4 如何找出数组中丢失的数124
4.5 如何找出数组中出现奇数次的数126
4.6 如何找出数组中第k小的数128
4.7 如何求数组中两个元素的小距离131
4.8 如何求解小三元组距离134
4.9 如何求数组中值小的数138
4.10 如何求数组连续和141
4.11 如何找出数组中出现1次的数145
4.12 如何对数组旋转147
4.13 如何在不排序的情况下求数组中的中位数148
4.14 如何求集合的所有子集150
4.15 如何对数组进行循环移位152
4.16 如何在有规律的二维数组中进行高效的数据查找155
4.17 如何寻找多的覆盖点157
4.18 如何判断请求能否在给定的存储条件下完成158
4.19 如何按要求构造新的数组160
4.20 如何获取好的矩阵链相乘方法161
4.21 如何求解迷宫问题163
4.22 如何从三个有序数组中找出它们的公共元素165
4.23 如何求两个有序集合的交集167
4.24 如何对有大量重复的数字的数组排序171
4.25 如何对任务进行调度174
4.26 如何对磁盘分区176
第5章 字符串178
5.1 如何求一个字符串的所有排列178
5.2 如何求两个字符串的长公共子串183
5.3 如何对字符串进行反转187
5.4 如何判断两个字符串是否为换位字符串189
5.5 如何判断两个字符串的包含关系191
5.6 如何对由大小写字母组成的字符数组排序193
5.7 如何消除字符串的内嵌括号194
5.8 如何判断字符串是否是整数196
5.9 如何实现字符串的匹配199
5.10 如何求字符串里的长回文子串202
5.11 如何按照给定的字母序列对字符数组排序208
5.12 如何判断一个字符串是否包含重复字符210
5.13 如何找到由其他单词组成的长单词212
5.14 如何统计字符串中连续的重复字符个数214
5.15 如何求长递增子序列的长度215
5.16 求一个串中出现的个长重复子串216
5.17 如何求解字符串中字典序的子序列218
5.18 如何判断一个字符串是否由另外一个字符串旋转得到220
5.19 如何求字符串的编辑距离222
5.20 如何在二维数组中寻找短路线224
5.21 如何截取包含中文的字符串227
5.22 如何求相对路径228
5.23 如何查找到达目标词的短链长度229
第6章 基本数字运算232
6.1 如何判断一个自然数是否是某个数的平方232
6.2 如何判断一个数是否为2的n次方234
6.3 如何不使用除法操作符实现两个正整数的除法236
6.4 如何只使用 = 操作符实现加减乘除运算240
6.5 如何根据已知
计算机技术博大精深、日新月异,Hadoop、GPU计算、移动互联网、模式匹配、图像识别、神经网络、蚁群算法、大数据、机器学习、人工智能、深度学习等新技术让人眼花缭乱,稍有不慎,就会被时代所抛弃。于是,很多IT从业者就开始困惑了,不知道从何学起,到底什么才是计算机技术的基石。其实,究其本质与基础,还是基础的数据结构与算法知识:Hash、动态规划、分治、排序、查找等。所以,无论是的大型企业,还是几个人的小公司,在面试求职者的时候,往往会考察这些基础的知识,无论你的研究方向是什么,这些基础知识还是应该熟练掌握的。
本书在写作风格上,推陈出新,对于算法的讲解,不仅有文字描述,更以示例佐证,能够更好地让读者读懂。为了能够写出精品书籍,我们对每一个技术问题都反复推敲,与算法大牛一起反复论证可行性,对于文字,我们咬文嚼字,字斟句酌,所有这些付出,只为让读者能够对书中的技术点放心,文字描述舒心。
市面上同类型书籍很多,也都写得不错,但是,我们相信,我们能够写出更适合读者需求的高质量精品书籍。为了能够在有限的篇幅里面尽可能地罗列出“干货”,我们在选择题目上也是下了巨大的功夫:首先,我们通过搜集近3年以来几乎所有IT企业的面试笔试算法真题,包括已经出版的其他著作、技术博客、在线编码平台、刷题网站等,保证所选样本足够大。其次,我们选择题目的时候尽可能不选择那种一眼就能知道结果的简单题,也不选择那种怪题、偏题、难题,我们的选题原则是选择难度适中或者看上去简单但实际容易出错的题目。通过我们的努力,力求遴选出来的算法真题能够限度地帮助读者。在真题的解析上,我们采用层层递进的方法,先易后难,层层深入,将问题抽丝剥茧,使得读者能够跟随我们的思路,一步步找到问题的解。
写作的过程是一个自我提高、自我认识的过程,很多知识,只有你深入理解与剖析后,才能领悟其中的精髓,掌握其中的技巧,程序员求职算法也不例外。本书不仅具备了其他书籍分析透彻、代码清晰合理等优点,还具备以下几个方面的优势:
,算法书籍分多种语言版本实现:C/C 、Java、C#、Python等,这样,不管读者侧重于哪一种语言,都能够有适合自己的书。后续可能还有PHP等其他语言描述的图书出现。本书中如果没有特别强调,代码实现均默认使用Python语言。
第二,每个题目除了循序渐进的分析以外,还对方法进行了详细阐述,针对不同方法的时间复杂度与空间复杂度,进行了详细的分析。除此之外,为了更具说服力,每一种方法几乎都对应有示例讲解,对方法是一种更好的辅助。
第三,代码较为规范,完全参照华为编程规范、Google编程规范规范编码。小作坊编码的时代早已过去,程序员要想在一个团队中大展拳脚,就离不开合作,而合作的基础就是共同遵循统一的编码规范。不仅如此,规范化的编码往往有助于读者理解代码。
第四,除了题目讲解,还有部分触类旁通的题目供读者练习。本书不可能囊括所有的程序员求职类的数据结构与算法类题目,但是,本书会尽可能地将一些常见的求职类算法题和具有代表性的算法题重点讲解,将其他一些题目以练习题的形式展现在读者面前,供读者思考与学习。
我是一个很乐观的人,人生在世,就是在发现问题,解决问题中度过,我总能够以饱满的精神状态完成创作。在此,感谢我的父母、姐姐、亲朋好友一直以来对我的关心与照顾,感谢我的大学老师刘坚教授、张立勇副教授、王献青副教授、霍秋艳副教授等对我的无私的知识传授,将我带进了计算机的殿堂,在我对学习感到困惑的时候,点亮我人生的灯塔。感谢同学与师兄弟们的兄弟情义,感谢同事们工作的支持以及业余一起打篮球、踢足球、谈人生、谈理想。感谢那些对我生活、工作给予巨大关心的人,是你们一路陪伴,让我孤独的心充满温暖与爱。正是有了你们,我的生活才更加丰富多彩。每每想到这些,我都对生活充满了无限的期待。
数据结构与算法知识博大精深,非一本或是几本书就能够将其讲解透彻,但不能因为这样就不去做这件事了。尽管本书竭尽所能希望将所有程序员求职过程中出现的面试笔试题一网打尽,试图做到知识覆盖面广,内容知识全,但仍然无法做到面面俱到,百分之百的读者满意率是本书以及后续改版奋斗与追求的目标,希望读者能够体谅。有兴趣的读者可以阅读《算法导论》《编程珠玑》等国外知名专家编写的专著进行知识的扩展与延伸。
其实,本书不仅可以作为程序员求职的应试类书籍,还可以作为数据结构与算法的教辅书籍。书中的很多思想、方法对于提高对数据结构与算法的理解是大有裨益的,不管你是本科生还是研究生,不管你是低年级学生还是高年级学生,不管你对计算机底层知识还是当前的计算机前沿知识是否了解,都不影响你学好本书。
本书是作者历经四年时间打造的技术精品,尽管我们用尽心思、绞尽脑汁地希望做到百分之百的准确性,但书中不足之处在所难免,在恳请读者原谅的同时,也希望读者能够将这些问题反馈到我们这里,以便于未来继续改进与提高,为读者提供更加优秀的作品。
本书中有部分思想来源于网络,无法追踪到出处,在此对这些幕后英雄致以崇高的敬意。没有学不好的学生,只有教不好的老师,我们希望无论是什么层次的学生,都能毫无障碍地看懂书中所讲内容。如果读者存在求职困惑或是对本书中的内容存在异议,都可以通过[email protected]联系作者。
猿媛之家
于西安
评论
还没有评论。