描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302589761
本书以数学为切入点,介绍用编程来解决数学问题,其中涉及的算法和游戏相关的题目也与数学相关。
本书针对有兴趣学习编程的初学者编写。本书不仅介绍Python编程的基本概念与入门知识,还介绍了大量常见的算法和游戏编程示例,其目的是锻炼读者的编程思维和提升动手能力。
本书以问题驱动为主线——通过提出一系列问题,然后介绍如何使用编程这种工具来解决它!这也是本书的独特之处。
你会发现,本书每一节的开头首先会提出一个问题,当你看到问题时,可以先思考如何解决,尝试自己动手编程来解决此问题,无论你是否能够成功解决,思考的过程都能使你受益,自主尝试解决后,再继续阅读书中提供的解题思路与方法,终与自己的思考结果相结合,从而不断进步。
本书涉及的题目分为三大类,一类是数学题目,这些题目很多都是中学学过的,如数学问题、几何图形相关的问题,看起来很简单,但也需要读者对问题进行思考与分析,设计出合适的算法编写程序来解决;第二类是算法问题,这类问题大都是数据结构相关的问题,如列表、栈、树、图等,对于这类问题,本书会给出概念和原理,即使你没有学过数据结构也一样可以轻松理解;第三类是游戏问题,这类问题也可以看作数学应用题以游戏的方式呈现出来,其中很多题目来自生活中的场景,如何将生活场景问题进行抽象,之后通过编程的方式解决,是本类问题的核心。
从数学问题到算法问题,再到游戏问题,每一类问题都会有多种题目,通过练习解答更多的题目,你的编程技艺和抽象思维能力也就在不知不觉中大幅提升了。
通过学习本书你会发现,编程并不是只有专业人士才能干的事,任何人只要有兴趣都可以学会它,重要的是你可以用编程来解决问题!
本书以数学为切入点,以Python编程语言为工具,介绍大量流行的编程题目的解题思路,并且提供了多种解题方案。本书涉及的编程题目领域广泛,包括数字类题目、图形类题目、字符串类题目、数据结构类题目以及游戏类题目等,由浅入深地训练读者的编程思维能力。通过本书的学习,读者可以掌握使用编程工具解决问题的核心思路,并能够独立思考和解决各种场景下的编程问题。 对于从未接触过编程的人员来说,本书以问题驱动的教学方法,因为有趣且强调动手实践,非常适合初学者快速入门。对于编程人员来说,本书介绍的解题思路和算法可以帮助编程人员提高代码质量。本书也适合编程领域的求职者使用,书中提供的编程题目很多都是面试中常见的算法问题。
第1章 走进Python世界 1
1.1 认识Python 1
1.1.1 Python的由来 1
1.1.2 Python可以做什么 2
1.2 开发环境准备 3
1.2.1 安装Python语言包 3
1.2.2 使用Sublime Text编程工具 4
1.3 编程中的基础概念 6
1.3.1 面向过程编程中的基础概念 6
1.3.2 面向对象编程中的基础概念 8
1.4 Python语法初步 9
1.4.1 编程风格 9
1.4.2 变量与数据类型 10
1.4.3 运算符 13
1.4.4 流程控制语句 15
1.4.5 常用的数学函数 17
1.4.6 字符串操作相关方法 18
1.4.7 列表操作相关方法 20
1.4.8 字典操作相关方法 20
1.4.9 函数 21
1.5 Python面向对象编程 22
1.5.1 Python中的类 23
1.5.2 类的继承 24
1.5.3 模块和包的应用 25
本章结语 27
第2章 编程与数学 28
2.1 二进制运算 28
2.1.1 计算机的思考方式 29
2.1.2 计算机中数据的存储方式 30
2.2 灵活使用程序打印数据 31
2.2.1 小试牛刀——打印乘法口诀表 31
2.2.2 小试牛刀——打印简单图形 33
2.3 小试牛刀——简易计算器 36
2.3.1 接收用户输入 37
2.3.2 在终端运行的简易计算器 38
本章结语 40
第3章 有趣的数字——特殊数 41
3.1 阿姆斯特朗数 41
3.1.1 什么是阿姆斯特朗数 42
3.1.2 算法与实现——判断一个数是否为阿姆斯特朗数 42
3.2 自除数 43
3.2.1 算法与实现——筛选自除数 43
3.2.2 使用高级循环方法对代码进行优化 44
3.3 完全平方数 45
3.3.1 算法实现——四平方数和定理 45
3.3.2 编程实现——解决完全平方数问题 46
3.4 强整数 47
3.4.1 编程实现——筛选强整数 47
3.4.2 代码改进——强整数检索上限的寻找 48
3.5 回文数 48
3.5.1 编程实现——判断回文数 48
3.5.2 代码改进——求回文素数 49
3.6 丑数 50
3.6.1 编程实现——如何判断丑数 51
3.6.2 代码改进——尝试找到第n个丑数 52
3.6.3 代码改进——解决丑数扩展问题 53
3.6.4 算法改进——使用二分查找第n个丑数 53
3.7 完美数 55
3.7.1 完美数的故事 55
3.7.2 编程实现——如何判断完美数 55
3.8 快乐数 56
3.9 顺次数 57
3.10 步进数 58
3.11 中心对称数 60
3.11.1 编程实现——通过字典映射来判断中心对称数 60
3.11.2 代码改进——查找指定位数的中心对称数 60
3.11.3 代码改进——确定中心对称数的个数 61
3.12 累加数 63
3.13 易混淆数 64
本章结语 65
第4章 有趣的数字——数字计算 66
4.1 二进制相关运算 66
4.1.1 编程实现——二进制求和 66
4.1.2 编程实现——求十进制数的反码 67
4.1.3 编程实现——计算汉明距离 68
4.1.4 代码改进——求二进制数中1的长间距 69
4.1.5 代码改进——颠倒二进制数 70
4.2 玩转四则运算 70
4.2.1 编程实现——一个数的各位相加 71
4.2.2 编程实现——不用加减乘除运算符做加法 72
4.2.3 代码改进——求阶乘的尾数 73
4.3 数字间的特殊运算 74
4.3.1 编程实现——平方根函数 74
4.3.2 编程实现——求平方数之和 75
4.3.3 编程实现——判断一个数是否为某数的幂次方 75
4.4 计算质数 76
4.4.1 编程实现——统计质数个数 76
4.4.2 编程实现——深度判断二进制数中特殊数的个数 78
4.5 数字转换 79
4.5.1 编程实现——整数转换 79
4.5.2 编程实现——整数转换成十六进制数 80
4.5.3 编程实现——将分数转换成小数 81
4.5.4 编程实现——罗马数字转整数 83
4.5.5 代码改进——整数转罗马数字 84
本章结语 85
第5章 图形世界的点线面 86
5.1 有趣的点与线 86
5.1.1 编程实现——连点成线 86
5.1.2 编程实现——短时间内访问所有的点 88
5.1.3 编程实现——找到穿过多点的直线 89
5.2 图形的奥妙 91
5.2.1 编程实现——输出杨辉三角 91
5.2.2 代码改进——尝试输出杨辉三角的某一行 92
5.2.3 编程实现——规划一个矩形合理的长和宽 93
5.2.4 编程实现——判断矩形是否重叠 94
5.2.5 代码改进——判断圆和矩形是否有重叠 95
5.2.6 编程实现——统计有效三角形的个数 97
5.3 周长与面积 98
5.3.1 编程实现——求重叠矩形的面积 98
5.3.2 编程实现——找到小面积的矩形 100
5.3.3 编程实现——求三角形的周长 103
5.3.4 编程实现——求的三角形面积 104
5.4 凸多边形 105
5.4.1 什么是凸多边形 105
5.4.2 向量叉乘 106
5.4.3 编程实现——判断凸多边形 106
5.5 三维图形 107
5.5.1 编程实现——计算三维形体的表面积 107
5.5.2 代码改进——求解三维形体的投影面积 109
本章结语 110
第6章 探索字符的世界——字符串操作 111
6.1 字符串的排列 111
6.1.1 编程实现——格式化字符串 111
6.1.2 编程实现——格式化字符串进阶 113
6.1.3 编程实现——字符串全排列 114
6.1.4 编程实现——根据字符出现的频率进行排序 116
6.1.5 编程实现——交换字符 117
6.2 字符串的分割 119
6.2.1 平衡字符串的分割 119
6.2.2 编程实现——分割出回文字符串 120
6.2.3 编程实现——分割字符串获取分数 121
6.3 字符串的查找与统计 121
6.3.1 编程实现——统计连续字符的长度 121
6.3.2 编程实现——检查字符串中所有的字符是否 122
6.3.3 编程实现——查找次出现的字符 123
6.3.4 编程实现——求长不含重复字符的子字符串长度 124
6.3.5 编程实现——查找常用字符 125
6.4 字符串的变换 126
6.4.1 编程实现——字符串平移 126
6.4.2 编程实现——字符串平移加密 127
6.4.3 编程实现——压缩字符串 128
6.4.4 编程实现——字符串解压 129
6.4.5 编程实现——将数字翻译成字符串 131
本章结语 132
第7章 探索字符的世界——字符串应用 133
7.1 单词提取 133
7.1.1 编程实现——统计字符串中的单词个数 133
7.1.2 编程实现——返回字符后一个单词的长度 134
7.1.3 编程实现——统计常用的单词 135
7.1.4 编程实现——拆分单词 136
7.1.5 编程实现——计算单词的短距离 137
7.2 词句重组 138
7.2.1 编程实现——从字符串中返回字母组成单词 138
7.2.2 编程实现——语句逆序 139
7.2.3 编程实现——语句重排 139
7.2.4 编程实现——单词前缀替换 140
7.3 单词缩写 141
7.3.1 编程实现——判断是否有相同的缩写 141
7.3.2 编程实现——列举单词所有缩写形式 143
7.4 语句处理 144
7.4.1 编程实现——比较语句的差异 144
7.4.2 编程实现——分析词组 145
7.5 回文字符串 146
7.5.1 编程实现——验证回文字符串 146
7.5.2 编程实现——构造回文字符串 147
7.5.3 编程实现——找到长的回文子字符串 149
7.5.4 编程实现——拼接构成回文串 149
7.6 字符串的复杂操作 150
7.6.1 编程实现——字符串解码 150
7.6.2 编程实现——构建IP地址 152
7.6.3 编程实现——验证IP地址的有效性 153
7.6.4 编程实现——实现模糊匹配 155
本章结语 156
第8章 玩转数据结构——列表与链表 157
8.1 获取列表中的信息 158
8.1.1 编程实现——寻找列表平衡点 158
8.1.2 编程实现——找到列表中缺失的元素 158
8.1.3 代码改进——寻找所有整数中两数之差值的值 159
8.1.4 代码改进——根据条件获取列表中的值 161
8.1.5 代码改进——寻找列表中连续元素的和的值 161
8.1.6 代码改进——寻找列表中长的连续递增序列 163
8.1.7 代码改进——寻找重复次数多的元素 164
8.1.8 代码改进——寻找列表的凸点 165
8.2 列表操作 166
8.2.1 编程实现——将列表中的0进行后置 166
8.2.2 代码改进——递增列表的合并 167
8.2.3 代码改进——向列表中插入元素 169
8.2.4 代码改进——清除重复元素 169
8.2.5 代码改进——列表分隔问题 171
8.2.6 代码改进——对列表进行原地排序 172
8.2.7 代码改进——判断列表是否有序 172
8.2.8 编程实现——构建斐波那契数列 173
8.3 列表中元素的和 174
8.3.1 编程实现——找到列表中合适的两个元素 174
8.3.2 代码改进——找出列表中所有满足条件的三元素组 175
8.4 简单链表操作 177
8.4.1 编程实现——遍历链表 178
8.4.2 代码改进——删除链表中的节点 179
8.4.3 代码改进——链表合并 181
8.4.4 代码改进——链表转整数 182
8.5 特殊性质的链表 183
8.5.1 编程实现——判断回文链表 183
8.5.2 代码改进——判断环形链表 183
8.5.3 链表重构——奇偶排列的链表 185
8.6 高级链表操作 186
8.6.1 编程实现——链表大数求和 186
8.6.2 代码改进——链表重排 188
8.6.3 代码改进——对链表进行原地排序 189
8.6.4 代码改进——旋转链表 190
8.6.5 代码改进——交换链表相邻的节点 191
8.6.6 编程实现——设计链表结构 192
本章结语 195
第9章 玩转数据结构——栈、堆与队列 196
9.1 简单栈数据结构 196
9.1.1 编程实现——设计栈结构 197
9.1.2 代码改进——利用栈清理无效的括号 198
9.1.3 代码改进——处理平衡括号 199
9.1.4 代码改进——进行括号内容逆序 200
9.1.5 代码改进——删除外层括号 201
9.1.6 代码改进——补充缺失的括号 202
9.1.7 代码改进——递归删除重复的相邻字符 203
9.1.8 代码改进——实现条件运算符 205
9.1.9 代码改进——简化文件路径 206
9.2 堆的简单应用 208
9.2.1 什么是堆 208
9.2.2 编程实现——查找高频单词 209
9.2.3 编程实现——寻找接近原点的n个点 210
9.3 队列的简单应用 211
9.3.1 编程实现——设计队列 211
9.3.2 代码改进——设计循环队列 213
本章结语 215
第10章 玩转数据结构——树与图 216
10.1 二叉树的判定 217
10.1.1 编程实现——解析二叉树的深度 218
10.1.2 代码改进——平衡二叉树的判定 220
10.1.3 代码改进——对称二叉树的判定 221
10.1.4 代码改进——判断两棵二叉树是否相同 223
10.1.5 代码改进——二叉树相加 224
10.1.6 代码改进——单值二叉树的判定 226
10.2 二叉树的遍历 226
10.2.1 编程实现——二叉树的前序遍历 227
10.2.2 代码改进——二叉树的中序遍历和后序遍历 228
10.2.3 代码改进——根据层序遍历二叉树 228
10.2.4 代码改进——垂直遍历二叉树 230
10.2.5 代码改进——将二叉树的遍历方式推广到N叉树 231
10.3 构造二叉树 233
10.3.1 编程实现——从遍历结果构造二叉树 233
10.3.2 代码改进——通过有序列表构造二叉搜索树 236
10.3.3 代码改进——在二叉搜索树中插入元素 237
10.4 删除二叉树中的节点 238
10.4.1 编程实现——在二叉搜索树中删除节点 238
10.4.2 代码改进——清除二叉树中的指定叶子节点 241
10.5 获取二叉树中存储的信息 242
10.5.1 编程实现——判断是否为堂兄弟节点 242
10.5.2 代码改进——获取二叉树中指定节点值的和 243
10.5.3 代码改进——计算二叉树路径的和 244
10.5.4 代码改进——计算树及所有子树的平均值 246
10.5.5 代码改进——完全二叉树的节点个数 247
10.6 图结构的应用 249
10.6.1 编程实现——网格中的近距离 249
10.6.2 代码改进——找到无环图中所有的路径 252
本章结语 253
第11章 烧脑游戏编程—— 热身篇 254
11.1 上楼梯 254
11.2 猜数字游戏 255
11.3 套餐组合问题 256
11.4 种树问题 257
11.5 算术机器人 258
11.6 单行的键盘 259
11.7 统计运动员的名次 260
11.8 分金币 260
11.9 传绣球游戏 261
11.10 扑克游戏 263
11.11 酒瓶子问题 264
11.12 所有可能的木板长度 265
11.13 电脑高手 265
11.14 灯泡问题 267
11.14.1 亮着的灯泡 267
11.14.2 不同功能的按钮 268
11.14.3 蓝色灯光的灯泡 270
11.14.4 翻转灯泡的状态 271
11.15 宝石鉴定 272
11.16 翻转游戏 272
11.17 井字棋的输赢判定 273
11.18 分发糖果问题 275
11.18.1 怎样分糖果可以尽可能多地使儿童满足 275
11.18.2 给弟弟分糖果 276
11.18.3 分发糖果 277
11.19 排布硬币 278
11.20 列表变换游戏 279
11.21 国际象棋中的车 280
11.22 计算员工的平均工资 282
11.23 比赛计分 283
11.24 股票买卖的盈利 284
11.25 单词组合游戏 285
本章结语 286
第12章 烧脑游戏编程——进阶篇 287
12.1 统计战舰个数 287
12.2 田忌赛马 289
12.3 炸弹人游戏 290
12.4 消除数字 291
12.5 为赛车加油 293
12.6 马走日 295
12.7 的岛屿面积 297
12.8 跳跃游戏 298
12.9 拿石子游戏 301
12.10 分割绳子 301
12.11 载人过河 302
12.12 迅捷斥候——提莫 304
12.13 水壶问题 305
12.14 叠罗汉 307
12.15 活字印刷术 308
本章结语 309
第13章 巧用编程工具 310
13.1 更加强大的编辑器 310
13.1.1 下载与配置VSCode 311
13.1.2 进行Python代码的调试 312
13.2 编写有趣的界面应用 315
13.2.1 使用Python开发桌面应用 315
13.2.2 进行用户交互 316
13.3 看得见的游戏 317
13.4 各种有趣而强大的Python模块 319
13.4.1 快速搭建网站 320
13.4.2 智能爬虫 321
本章结语 324
首先感谢读者愿意花时间阅读本书。选择本书说明你了解编程,或者至少对编程有兴趣。本书定义为一本计算机科学的编程书其实并不确切,因为书中并不会介绍晦涩难懂的编程语言语法,也不会介绍实际应用中的项目开发方法,本书只是提供了一系列的问题,然后介绍如何使用编程这种工具来解决它。但是将本书定义为数学学科的图书也不正确,虽然书中很多问题与数学有关,有时甚至需要我们了解底层的数学原理才能解决,但是同样,对于本书来说,数学也是解决问题的工具。那么,我们姑且称此书为“问题之书”吧。
阅读任何一本书的过程实际上都是一种学习的过程,你现在关心的应该是如何学习本书,以及本书能够带给你什么。首先,阅读本书需要有一定的编程基础,至少了解和学习过一门编程语言,当然如果掌握了Python编程语言就好不过了。在本书中,每一节的开头都会提出一个问题,当你看到问题时,可以先思考如何解决,尝试自己动手编程来解决此问题,无论你是否能够成功解答,思考的过程都能使你受益,自主尝试解答后,再继续阅读书中提供的解题思路与方法,终与自己的思考结果相结合,从而不断进步。
在章节安排上,本书共13章。除了第1章与第13章之外,每一章都是一个独立的专题,并没有严格的先后顺序。因此,如果你在阅读本书时对某一章节的内容不太感兴趣,完全可以跳过它。但是笔者依然建议按照书中章节的安排顺序进行阅读,从易到难的学习节奏对大多数读者来说是更科学的。本书中的示例题目收集自互联网上流行的编程训练集,笔者对其中的题目大多都进行了修正和改编,以期更适合入门级的读者学习。
第1章是本书的入门章节,本书中提供的问题解答示例都是以Python编程语言为基础进行编程解答的,因此读者需要对Python编程语言本身有简单的了解。在本章中,将首先为读者介绍Python语言在编程领域的用武之地,本书之所以选择Python作为主语言,正是由于其拥有使用简单、应用广泛的特点。你完全不需要担心没有基础能否顺利地学习,本章会对Python中核心的基础语法进行介绍,只要掌握了这些技能,阅读本书的后续章节就不会有任何障碍。本章也将带领读者一起安装完成Python编程所需的相关开发环境。
第2章以数学为切入点,介绍编程在数学领域的应用方式,也将向读者介绍一些基础的计算机原理知识,帮助读者理解程序的工作原理。
第3、4章提供了一系列与数字相关的编程题。第3章主要介绍特殊的数字,比如阿姆斯特朗数、回文数、完全平方数等。第4章主要介绍与数字计算相关的编程题,例如二进制运算、分数运算等。通过这些题目的练习,能够使读者更加深刻地理解二进制,运用二进制。
第5章介绍的编程题都与几何图形相关,与图形相关的题目能够锻炼大脑的抽象思维能力。本章提供的题目重点关注生活中几何图形的点、线、面的关系,其中可能会使用到一些简单的几何定理,但更多需要读者对问题进行思考与分析,设计出合适的算法来编写程序解决问题。
第6、7章的题目都与字符相关,字符与字符串的操作是实际编程工作中非常重要的技能,因此本章提供的题目相对更加面向应用,在计算机语义识别、数据整理与报表等诸多领域,字符串操作技术都有广泛应用。
第8~10章是计算机数据结构相关的内容,通过对数组、链表、堆栈和树相关结构的题目进行练习,可以帮助读者更加深入地理解数据结构的原理以及数据结构设计的巧妙之处。这几章的题目难度也略高。
第11、12章以游戏的方式来介绍编程题目,在数学上,我们也称此类题目为应用题。其中提供的大部分题目都来自生活中的场景,如何将生活场景问题进行抽象,之后通过编程的方式解决,是本章的核心内容。
第13章是本书的附加章节,当读者完成本书前12章的学习后,相信对编程也会有新的理解。此时对于读者来说,编程不应该是结束,而是新的开始。本章将向读者介绍更多Python编程领域,例如网站开发、游戏开发等,读者可以选择自己感兴趣的内容继续深入学习。
后,对于本书的出版,感谢支持笔者的家人和朋友,感谢清华大学出版社王金柱编辑的勤劳付出。在王编辑的指导下,笔者才得以完成本书的章节规划、内容修正等工作。重中之重是感谢读者的耐心,笔者由衷地希望本书可以带给读者预期的收获。无论是学习还是工作,都希望读者在阅读本书后能够更上一层楼。同时,由于编者水平所限,书中难免出现疏漏和欠妥之处,欢迎读者批评指正。
本书源码获取
读者可用微信扫描下方的二维码下载本书源代码。如果在学习本书的过程中遇到问题,请联系[email protected],邮件主题为“每个人的Python:数学、算法和游戏编程训练营”。
张益珲
2021年4月24日
评论
还没有评论。