《Python程序员面试宝典》是一本介绍Python程序员面试的图书宝典。这里,不仅介绍了程序员算法面试中的*公式,而且通过具体的实例从多角度剖析各类算法面试题,为读者建立了一个完整的算法面试的方案数据库,让读者快速理解全书内容、做到胸有成竹应对面试的同时,也为未来的职业发展铺平道路。
《Python程序员面试宝典》共分12章,其中前两章首先引入一道亚马逊面试题,并进行情景分析和解题思路,然后从技术面试的方法论和心态建设入手,介绍应对面试的基本方法和思路。后10章分别从基础数据类型、数组和字符串、链表、堆栈、二叉树、堆、二分查找法、图论、贪婪算法和动态规划等多个方面去详解各类面试题,分析算法面试中*常见的各类技术问题。通过本书的学习,希望读者能够在大脑中建立起自己的解决方案数据库,面试时可以迅速地搜索出相应的解决方案,从而提高解题效率和增加通过面试的几率。
《Python程序员面试宝典》书中所有代码都采用python语言开发。其语法结构简单,易于掌握,非常适合于高校计算机相关专业毕业生求职面试前的笔试参考用书,也可以作为计算机相关专业学生学习数据结构和算法的辅助教材,所有致力于程序员职业的读者均可选择本书学习。
精选Facebook、Google、Microsoft、Amazon和BAT等大型企业的Python算法面试题,并进行详细的剖析、分类归纳,提炼出算法面试的各种应对技巧,是一本Python程序员算法面试的图书宝典。
全面介绍Python程序员面试笔试技巧和方法,教你如何以不变应万变。
全面:两万多行代码,100多个知识点,全面覆盖Python程序员各类面试题型。
权威:15年开发经验、实战技巧总结,站在巨人的肩膀上,让学习走捷径。
深入:采用抽丝剥茧式分析,深入解释计算机科学的底层逻辑算法及原理。
实战:包括60多个算法题目,针对性强,拿来就用。通过实战学习解题思路。
陈屹,海南康康饼网络科技有限公司CEO,15年开发面试经验,曾在微软、联想、realplayer等公司承担客户端和服务器开发工作。在算法设计、高并发、高性能服务器、复杂系统设计、人工智能等多个领域拥有深厚积累,其设计的编译原理、操作系统、网络协议系统等多门原厂教学视频在网易云课堂收到大量好评。
第1章技术面试的方法论1
1.1 一道亚马逊面试题的情景分析1
1.1.1 暴力枚举法2
1.1.2 分而治之法4
1.1.3 最优解法6
1.1.4 解题流程总结7
1.2 面试的流程,心态建设,相关准备8
1.2.1 面试前流程8
1.2.2 简历的制作10
1.2.3 有效的面试策略11
1.2.4 编码实现12
1.2.5 面试过程中的交流要点13
1.3 知己知彼,百战不殆从面试官角度看面试14
1.3.1 如何进行一场良好的面试15
1.3.2 面试官如何主导面试流程17
1.3.3 面试官如何评估候选人17
第2章算法面试的技术路线图19
2.1 算法面试中的数据结构19
2.1.1 基础数据类型20
2.1.2 数组与字符串21
2.1.3 链表21
2.1.4 堆栈22
2.1.5 二叉树22
2.1.6 堆23
2.1.7 哈希表23
2.2 算法的设计模式24
2.2.1 排序24
2.2.2 递归26
2.2.3 分而治之27
2.2.4 动态规划29
2.2.5 贪婪算法29
2.2.6 逐步改进29
2.2.7 排除法30
2.3 抽象分析模式30
2.3.1 样例覆盖31
2.3.2 小量数据推导31
2.3.3 简单方案的逐步改进32
2.3.4 问题还原33
2.3.5 图论模拟34
第3章基础数据类型的算法分析35
3.1 基础数据类型中二进制位的操作算法35
3.1.1 整型变量值互换35
3.1.2 常用的二进制位操作36
3.1.3 解析一道二进制操作相关算法面试题37
3.1.4 总结40
3.2 用二进制操作求解集合所有子集40
3.2.1 题目描述40
3.2.2 算法描述40
3.2.3 代码实现41
3.2.4 算法分析43
3.3 使用二进制求解最大公约数43
3.3.1 题目描述43
3.3.2 算法描述45
3.3.3 代码实现47
3.3.4 算法分析49
3.4 素数判定50
3.4.1 题目描述50
3.4.2 算法描述50
3.4.3 代码实现52
3.4.4 算法分析53
3.5 判断矩形交集54
3.5.1 题目描述54
3.5.2 算法描述54
3.5.3 代码实现56
3.6 数字与字符串相互转化,简单题目的隐藏陷阱58
3.6.1 题目描述58
3.6.2 算法描述58
3.6.3 代码实现59
3.6.4 算法分析60
3.7 Elias Gamma编码算法62
3.7.1 题目描述62
3.7.2 算法描述63
3.7.3 代码实现63
3.7.4 算法分析66
3.8 整型的二进制乘法67
3.8.1 题目描述67
3.8.2 算法描述67
3.8.3 代码实现69
3.8.4 算法分析73
第4章数组和字符串74
4.1 数组的定位排序74
4.1.1 题目描述74
4.1.2 算法描述75
4.1.3 代码实现76
4.1.4 算法分析78
4.2 在整型数组中构建元素之和能整除数组长度的子集78
4.2.1 题目描述78
4.2.2 算法描述78
4.2.3 代码实现79
4.2.4 算法分析82
4.3 计算等价类82
4.3.1 题目描述82
4.3.2 算法描述83
4.3.3 代码实现85
4.3.4 代码分析86
4.4 大型整数相乘87
4.4.1 题目描述87
4.4.2 算法描述87
4.4.3 代码实现88
4.4.4 代码分析91
4.5 数组的序列变换92
4.5.1 题目描述92
4.5.2 算法描述92
4.5.3 代码实现94
4.5.4 代码分析96
4.6 字符串的旋转96
4.6.1 题目描述96
4.6.2 算法描述96
4.6.3 代码实现97
4.6.4 代码分析99
4.7 二维数组的启发式搜索算法99
4.7.1 题目描述99
4.7.2 算法描述99
4.7.3 代码实现100
4.7.4 代码分析101
4.8 二维数组的旋转遍历102
4.8.1 题目描述102
4.8.2 算法描述102
4.8.3 代码实现104
4.8.4 代码分析105
4.9 矩阵的90旋转105
4.9.1 题目描述106
4.9.2 算法描述106
4.9.3 代码实现107
4.9.4 代码分析109
4.10 游程编码109
4.10.1 题目描述110
4.10.2 算法描述110
4.10.3 代码实现110
4.10.4 代码分析112
4.11 字符串中单词的逆转113
4.11.1 题目描述113
4.11.2 算法描述113
4.11.3 代码实现114
4.11.4 代码分析115
4.12 Rabin-Karp字符串匹配算法115
4.12.1 题目描述115
4.12.2 算法描述115
4.12.3 代码实现118
4.12.4 代码分析120
4.13 用有限状态自动机匹配字符串120
4.13.1 题目描述120
4.13.2 算法描述121
4.13.3 代码实现124
4.13.4 代码分析127
4.14 KMP算法字符串匹配算法的创意巅峰127
4.14.1 题目描述127
4.14.2 算法描述127
4.14.3 代码实现129
4.14.4 代码分析131
4.15 正则表达式引擎的设计和实施132
4.15.1 题目描述132
4.15.2 算法描述133
4.15.3 代码实现138
4.15.4 代码分析178
第5章队列和链表179
5.1 递归式实现链表快速倒转179
5.1.1 题目描述179
5.1.2 算法描述180
5.1.3 代码实现181
5.1.4 代码分析184
5.2 链表成环检测184
5.2.1 题目描述185
5.2.2 算法描述185
5.2.3 代码实现186
5.2.4 代码分析189
5.3 在O(1)时间内删除单链表非末尾节点190
5.3.1 题目描述190
5.3.2 算法描述190
5.3.3 代码实现191
5.3.4 代码分析192
5.4 获取重合列表的第一个相交节点192
5.4.1 题目描述193
5.4.2 算法描述193
5.4.3 代码实现194
5.4.4 代码分析196
5.5 单向链表的奇偶排序196
5.5.1 题目描述196
5.5.2 算法描述196
5.5.3 代码实现198
5.5.4 代码分析199
5.6 双指针单向链表的自我复制199
5.6.1 题目描述200
5.6.2 算法描述200
5.6.3 代码实现202
5.6.4 代码分析206
5.7 利用链表层级打印二叉树206
5.7.1 题目描述206
5.7.2 算法描述206
5.7.3 代码实现207
5.7.4 代码分析209
第6章堆栈和队列210
6.1 利用堆栈计算逆向波兰表达式210
6.1.1 题目描述210
6.1.2 算法描述210
6.1.3 代码实现211
6.1.4 代码分析213
6.2 计算堆栈当前元素最大值213
6.2.1 题目描述213
6.2.2 算法描述213
6.2.3 代码实现214
6.2.4 代码分析216
6.3 使用堆栈判断括号匹配216
6.3.1 题目描述216
6.3.2 算法描述216
6.3.3 代码实现217
6.3.4 代码分析218
6.4 使用堆栈解决汉诺塔问题218
6.4.1 题目描述218
6.4.2 算法描述219
6.4.3 代码实现219
6.4.4 代码分析222
6.5 堆栈元素的在线排序222
6.5.1 题目描述223
6.5.2 算法描述223
6.5.3 代码实现224
6.5.4 代码分析225
6.6 计算滑动窗口内的最大网络流量225
6.6.1 题目描述226
6.6.2 算法描述226
6.6.3 代码实现231
6.6.4 代码分析234
6.7 使用堆栈模拟队列234
6.7.1 题目描述235
6.7.2 算法描述235
6.7.3 代码实现235
6.7.4 代码分析236
第7章二叉树238
7.1 二叉树的平衡性检测238
7.1.1 题目描述239
7.1.2 算法描述239
7.1.3 代码实现239
7.1.4 代码分析242
7.2 镜像二叉树的检测242
7.2.1 题目描述243
7.2.2 算法描述243
7.2.3 代码实现244
7.2.4 代码分析246
7.3 二叉树的Morris遍历法247
7.3.1 题目描述247
7.3.2 算法描述247
7.3.3 代码实现250
7.3.4 代码分析251
7.4 使用前序遍历和中序遍历重构二叉树252
7.4.1 题目描述252
7.4.2 算法描述253
7.4.3 代码实现254
7.4.4 代码分析256
7.5 逆时针打印二叉树外围边缘256
7.5.1 题目描述256
7.5.2 算法描述257
7.5.3 代码实现257
7.5.4 代码分析259
7.6 寻找两个二叉树节点的最近共同祖先259
7.6.1 题目描述260
7.6.2 算法描述260
7.6.3 代码实现260
7.6.4 代码分析264
7.7 设计搜索输入框的输入提示功能264
7.7.1 题目描述264
7.7.2 算法描述264
7.7.3 代码实现265
7.7.4 代码分析269
第8章堆270
8.1 使用堆排序实现系统Timer机制270
8.1.1 题目描述270
8.1.2 算法描述270
8.1.3 代码实现273
8.1.4 代码分析279
8.2 波浪形数组的快速排序法279
8.2.1 题目描述279
8.2.2 算法描述280
8.2.3 代码实现281
8.2.4 代码分析287
8.3 快速获取数组中点的相邻区域点287
8.3.1 题目描述287
8.3.2 算法描述287
8.3.3 代码实现289
8.3.4 代码分析292
第9章二分查找法293
9.1 隐藏在《编程珠玑》中20年的bug293
9.1.1 题目描述294
9.1.2 算法描述294
9.1.3 代码实现295
9.1.4 代码分析297
9.2 在lg(k)时间内查找两个排序数组合并后第k小元素297
9.2.1 题目描述297
9.2.2 算法描述297
9.2.3 代码实现299
9.2.4 代码分析301
9.3 二分查找法寻求数组截断点302
9.3.1 题目描述302
9.3.2 算法描述302
9.3.3 代码实现304
9.3.4 代码分析306
9.4 在双升序数组中快速查找给定值306
9.4.1 题目描述307
9.4.2 算法描述307
9.4.3 代码实现307
9.4.4 代码分析309
第10章图论310
10.1 地图着色问题310
10.1.1 问题描述310
10.1.2 算法描述310
10.1.3 代码实现311
10.1.4 代码分析315
10.2 迪杰斯特拉最短路径算法316
10.2.1 题目描述316
10.2.2 算法描述316
10.2.3 代码实现319
10.2.4 代码分析326
10.3 使用深度优先搜索解决容器倒水问题327
10.3.1 问题描述327
10.3.2 算法描述327
10.3.3 代码实现329
10.3.4 代码分析333
第11章贪婪算法335
11.1 最小生成树335
11.1.1 题目描述335
11.1.2 算法描述336
11.1.3 代码实现339
11.1.4 代码分析344
11.2 霍夫曼编码344
11.2.1 题目描述345
11.2.2 算法描述345
11.2.3 代码实现347
11.2.4 代码分析349
11.3 离散点集的最大覆盖率问题350
11.3.1 题目描述350
11.3.2 算法描述351
11.3.3 代码实现352
11.3.4 代码分析355
第12章动态规划356
12.1 钢管最优切割方案356
12.1.1 问题描述357
12.1.2 算法描述357
12.1.3 代码实现358
12.1.4 代码分析360
12.2 查找最大共同子串361
12.2.1 问题描述362
12.2.2 算法描述362
12.2.3 代码实现364
12.2.4 代码分析366
12.3 将最大共同子串算法的空间复杂度从O(n2)改进为O(n)366
12.3.1 问题描述367
12.3.2 算法描述367
12.3.3 代码实现368
12.3.4 代码分析371