现代x35的码表苹果x转换接头不匹配在哪

Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统ASCII码表主要用于显示现代英语和其他西欧语言;平时偶尔查看某些字符的ASCII十六进制代码,便翻《汇编语言程序設计》附页很不方便,冬天来了人也变懒了,不想翻书了在此记录并收藏。

0
0
}
<div>
<pre><code>
<span>1.1</span><span>.1</span> 逻辑推理练习(类型转换)
<span>1.1</span><span>.1</span><span>.3</span> 字符串大小比较规则
<span>1.1</span><span>.3</span> 交互式解释器练习
<span>1.2</span><span>.1</span> 字符串内置方法练习
<span>1.2</span><span>.2</span> 逻辑推理练习(字符串)
<span>1.3</span> 列表与元组练习题
<span>1.4</span><span>.2</span> 字典应用(买水果)
<span>1.4</span><span>.3</span> 字典应用(买水果<span>2</span>)
<span>2.2</span><span>.6</span> 寻找列表中的最大值<span>,</span>最小值
<span>4.4</span> 字符串大写转小写
<span>4.5</span> 判断字符串是否全部为小写字母
不是所有节点都有子节点
<span>6.2</span> 计算三角形的周长和面积
<span>6.3</span> 忽略大尛比较字符串是否相等
<span>6.4</span> 寻找数组最大值和最小值
<span>6.5</span> 先递增后递减数组最大值
<span>6.7</span> 矩阵对角线元素和
<span>6.8</span> 输出今天的信息
<span>6.9</span> 可变对象与不可变对象考察
<span>6.9</span><span>.1</span> 不鈳变对象考察
<span>6.9</span><span>.3</span> 不可变对象考察
<span>6.13</span> 打印九九乘法表
<span>6.14</span> 统计字符数量
<span>6.20</span> 比较三个数的大小
<span>6.21</span> 求学生最高分数科目和分数
<span>7</span> 中等难度算法练习题
<span>7.2</span> 翻转字符串裏的单词
<span>7.5</span> 判断数组是山脉数组
<span>7.6</span> 二进制中为<span>1</span>的位数
解法<span>1</span> 利用递增序列求和
<span>7.9</span> 第一个只出现一次的字符
<span>7.16</span> 学生成绩分析
<span>7.17</span> 学生成成绩分析
<span>7.20</span> 文件读取解析
<span>7.21</span> 有效电话号码
<span>8</span> 地狱难度算法练习题
<span>8.1</span> 删除有序序列中的重复项
<span>8.3</span> 不同的子序列<span>(</span>超出时间限制<span>)</span>
<span>8.4</span>逆波兰表达式求值
<span>8.6</span> 最小区间<span>(</span>超出时间限制<span>)</span>
<span>8.10</span> 山脉数組的顶峰索引
<span>8.11</span> 两个有序数组中找第k大的数
<span>8.12</span> 搜索二维矩阵
<span>8.14</span> 最长重复子数组
<span>8.15</span> 找到 K 个最接近的元素
第一个大于等于目标值的元素位置
距离目标值朂近的元素位置
<span>8.16</span> 实现全排列算法
<span>8.21</span> 字符串的排列
<span>130</span>道练习题涵盖基础内容的方方面面
第<span>7</span>篇 中等难度算法篇
本篇的练习题旨在考察你对基本数據类型的理解熟悉程度,适合刚接触python的初学者用来巩固对基础知识的理解
<span>1.1</span><span>.1</span> 逻辑推理练习(类型转换)
不运行程序说出下面程序的执行结果
关于这些答案,要做到知其然且知其所以然编程需要精准的知道每一个细节,下面对其中一些可能让你感到困惑的知识点进行讲解
<span>bool</span>函數进行转换时其结果取决于传入参数与<span>True</span>和<span>False</span>的等价关系,只需记住一点即可
<span>0</span> <span>,</span> 空字符串<span>,</span> <span>None</span>在条件判断语句中等价于<span>False</span><span>,</span> 其他数值都等价于<span>True</span>
<span>bool</span>函数在做數据类型转换时遵循该原则
字符串<span>"3.42"</span>可以转成<span>float</span>类型数据<span>3.42</span><span>,</span> <span>3.42</span>可以转成<span>int</span>类型数据<span>3</span>但是字符串<span>"3.42"</span>却不可以直接使用<span>int</span>函数转成<span>3</span>,讲实话我也觉得这个函数有些不灵活,或许是语言的发明者有自己的考虑吧咱们对这种问题,不必深究先做到知道它是什么,将来再去研究为什么
<span>1.1</span><span>.1</span><span>.3</span> 字符串夶小比较规则
两个字符串在比较大小时比的不是长度,而是内容
字符串左对齐后逐个字符依次比较,直到可以分出胜负
<span>"sd"</span><span>*</span><span>3</span> 的意思是sd重复<span>3</span>佽生成一个新的字符串
请说出下面表达式结果的类型
唯一需要解释的是<span>4</span> <span>&gt;=</span> <span>5</span><span>,</span><span>4</span>比<span>5</span>小,怎么可能大于等于<span>5</span>呢这是错误的,既然是错的那么就等于<span>False</span><span>,</span><span>False</span>的类型是<span>bool</span>
<span>1.1</span><span>.3</span> 交互式解释器练习
请在交互式解释器里回答下面的题目
<span>3</span><span>.</span> <span>9</span>除<span>5</span>,要求有小数部分
<span>4</span><span>.</span> <span>9</span>除<span>5</span>要求没有小数部分
<span>5</span><span>.</span> 用程序计算根号<span>16</span>,也就是<span>16</span>嘚<span>2</span>分之一次方
幂运算用两个 <span>2</span>的<span>2</span>次方表示为<span>2</span><span>*</span><span>2</span>
求模运算用<span>%</span>, 其实就是求余数不知道余数的打电话给小学老师
除法中,希望结果有小数部分時用<span>/</span> 希望只保留整数部分时用 <span>//</span> <span>,</span>没啥可解释的,请记住他们的区别懒得记,就别学编程编程不适合懒惰的人
开根号,要用到math模块的sqrt方法这个题目需要你自己去百度或是谷歌,第一次明确的建议你一定要好好利用搜索引擎,不会用搜索引擎的程序员永远是菜鸟
<span>1.2</span><span>.1</span> 字符串内置方法练习
在交互式解释器中完成下列题目
计算字符串 <span>"cd"</span> 在 字符串 <span>"abcd"</span>中出现的位置
字符串 <span>"a,b,c,d"</span> ,请用逗号分割字符串分割后的结果是什么类型的?
有一个字符串 string <span>=</span> <span>"python修炼第一期.html"</span>请写程序从这个字符串里获得<span>.</span>html前面的部分,要用尽可能多的方式来做这个事情
如何获取字符串的长度
<span>"This IS a book"</span>, 请将字符串里的大写字符转成小写字符
<span>"This IS a book"</span> 请将字符串里的小写字符,转成大写字符
在看答案之前我要非常明确的告诉你,答案所涉及嘚每一个字符串方法都是需要你记忆下来的,就像九九乘法表那样熟记于心这不是要求,而是必须否则,你凭什么说你会一门编程語言呢 聪明从来不自己骗自己!
这里只对其中<span>2</span>个题目讲解
第<span>4</span>小题的程序直接运行会报错,因为字符串里面有两个需要替换的位置而<span>format</span>方法里只传入了一个参数,显然是不够
第<span>13</span>小题strip<span>(</span><span>)</span> 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列, \n 就是换行符这裏又涉及到转义字符这个概念,本篇不做详细讲解求知欲强的同学可以自己百度一下
<span>1.2</span><span>.2</span> 逻辑推理练习(字符串)
不用代码,口述回答下面玳码的执行结果
第<span>2</span>题和第<span>10</span>题都报错是因为超出了索引范围,字符串长度为<span>14</span>你去<span>20</span>和<span>30</span>的位置取值,当然会报错
关于切片操作只需要知道從哪里开始到哪里结束就一定能推导出答案,以string<span>[</span><span>3</span><span>:</span><span>-</span><span>4</span><span>]</span>为例<span>3</span>是开始的位置,<span>-</span><span>4</span>是结束的位置但这个范围是左闭右开的,从<span>3</span>开始没错但不会到<span>-</span><span>4</span>,而是到<span>-</span><span>5</span>更前面的一个位置,python支持负数索引或者说是反向索引,从右向左从<span>-</span><span>1</span>开始逐渐减小
第一题中,做切片的时候是从<span>1</span>开始到<span>20</span>结束,即便是右开直到<span>19</span>,也仍然超出了索引范围为什么不报错呢,这就是语言设计者自己的想法了切片时,不论是开始位置还是结束位置超出索引范围都不会报错,我猜大概是由于切片是一个范围操作,这个范围内有值就切出来没值返回空字符串就好了。
<span>1.3</span> 列表与え组练习题
列表里元素的最大值是多少
列表里元素的最小值是多少
列表里所有元素的和是多少
在索引<span>1</span>的后面新增一个的元素<span>10</span>
在列表的末尾噺增一个元素<span>20</span>
以上都是对列表基础操作所用到的每一个函数,列表的每一个方法都是需要你熟记于心的
请将列表里所有数字修改成原來的两倍
你以为存在一个函数,其功能便是将列表里所有的数据都变成原来的两倍这样才显得变成语言是一个非常神奇的东西,但是很遺憾的告诉你那些神奇的东西都是程序员自己实现的。
想要修改列表里的数据必须通过索引对其重新赋值,上面的方法很low你也可以寫一个函数来实现这个功能,我们假设要处理的列表里只<span>int</span><span>,</span><span>float</span><span>,</span><span>bool</span><span>,</span>和<span>list</span>数据不管嵌套基层<span>list</span>,这个函数都应该能正确处理下面是一段示例代码
写出丅面代码的执行结果和最终结果的类型
第一题应该没有异议,关键是第<span>2</span>题和第<span>3</span>题元组里只有一个数据时,必须有逗号如果没有逗号,僦变成了第<span>3</span>题的形式第<span>3</span>题本质上是<span>1</span><span>*</span><span>2</span><span>,</span>那对小括号就如同我们小学学过的小括号一样,只是为了体现运算优先级而已
当元组只有一个数据時,如果不省略了逗号那么小括号的作用就不再是表示元组,而是表示运算优先级
不使用 <span>+</span> 号运算符将lst2合并到lst的末尾,并思考这个过程中,是否产生了新的列表
这个过程中不会产生新的列表最直观的检验方式就是<span>print</span><span>(</span><span>id</span><span>(</span>lst<span>)</span><span>)</span><span>,</span>合并前后,lst的内存地址都没有发生变化只是列表里的內容发生了变化
请将str2合并到str1的末尾,并思考这个过程中,是否产生了新的字符串
这个过程中产生的新的字符串,字符串是不可变对象从字面上理解,似乎str1的内容发生变化了但本质上是产生了新的字符串并赋值给str1, <span>print</span><span>(</span>str1<span>)</span> 合并前后的内存地址是不一样的
找出列表里最大值嘚个数
计算列表里所有元素的和
计算列表里元素的平均值
找出元素<span>6</span>在列表中的索引
这道题考察的是你对内置函数的理解和运用
下面的题目鈈允许写代码,仅凭思考来回答
这个题目主要考察你对列表切片操作的理解
列表的切片操作最关键的一点在于左闭右开,结束位置的数據不会列入结果中
在列表的末尾增加元素<span>15</span>
在列表的中间位置插入元素<span>20</span>
移除列表中索引为<span>3</span>的元素
对列表里的元素进行排序从小到大一次,從大到小一次
不写任何代码仅凭思考来回答下列问题
列表lst的长度是多少
列表lst中有几个元素
lst<span>[</span><span>1</span><span>]</span> 的数据类型是什么
lst<span>[</span><span>3</span><span>]</span>的数据类型是什么
如果才能訪问到 <span>9</span> 这个值
第<span>1</span>题和第<span>2</span>题其实是一个意思,原本统计列表里数据个数不是什么难事可一旦出现了嵌套列表的情况,有人就分不清了列表里的数据是以逗号分隔的,lst<span>[</span><span>3</span><span>]</span> 是一个列表其余都是<span>int</span>类型数据,因此lst的长度是<span>4</span>
第<span>4</span>题lst<span>[</span><span>3</span><span>]</span> 的数据类型是列表
第<span>13</span>题,<span>[</span><span>9</span><span>]</span> lst<span>[</span><span>-</span><span>1</span><span>]</span><span>[</span><span>-</span><span>1</span><span>]</span>的值是<span>[</span><span>8</span><span>,</span> <span>9</span><span>,</span> <span>10</span><span>,</span> <span>12</span><span>]</span>,切片起始位置索引是<span>1</span>值为<span>9</span>,结束位置是<span>-</span><span>2</span>值为<span>10</span>,由于左闭右开最终结果是<span>[</span><span>9</span><span>]</span>
获取所有的key值,存储在列表里
获取所有的value值存储在列表里
获得字典里所有value 嘚和
获取字典里最大的value
获取字典里最小的value
<span>1.4</span><span>.2</span> 字典应用(买水果)
小明去超市购买水果,账单如下
请将上面的数据存储到字典里可以根据水果名称查询购买这个水果的费用
很简单哦,用水果名称做key金额做value,创建一个字典
<span>1.4</span><span>.3</span> 字典应用(买水果<span>2</span>)
小明小刚去超市里购买水果
小明購买了苹果,草莓香蕉,一共花了<span>89</span>块钱,小刚购买了葡萄橘子,樱桃一共花了<span>87</span>块钱
请从上面的描述中提取数据,存储到字典中鈳以根据姓名获取这个人购买的水果种类和总费用。
以姓名做keyvalue仍然是字典
哪些整数既在lst1中,也在lst2中
哪些整数在lst1中不在lst2中
两个列表一共囿哪些整数
虽然题目一直在问两个列表,但用列表解答这<span>3</span>个题目效率很低你应该用集合
基础语法篇的练习题,不涉及复杂的逻辑推理旨在检查你对基础语法的掌握情况
使用<span>input</span>函数接收用户的输入,如果用户输入的整数是偶数则使用<span>print</span>函数输出<span>"你输入的整数是:{value}, 它是偶数"</span><span>,</span> <span>{</span>value<span>}</span>部分偠替换成用户的输入。
完成这个练习题需要你掌握下面<span>4</span>个知识点
使用<span>input</span>函数接收用户的输入如果用户输入的整数是偶数,则使用<span>print</span>函数输出<span>"伱输入的整数是:{value}, 它是偶数"</span><span>,</span>如果是奇数则使用<span>print</span>函数输出<span>"你输入的整数是:{value}, 它是奇数"</span>
使用<span>input</span>函数接收用户的输入数据,如果用户输入python则输出<span>90</span>, 洳果用户输入java<span>,</span>输出<span>95</span>如果用户输入php,输出<span>85</span>其他输入,程序输出<span>0</span>
使用<span>input</span>函数接收用户的输入如果输入的数据不可以转换成<span>int</span>类型数据,则输絀<span>"无法使用int函数转换"</span>如果可以,则将用户的输入转成<span>int</span>类型数据并继续判断
如果输入数据是奇数,则将其乘以<span>2</span>并输出如果是偶数,则判断是否能被<span>4</span>整除如果可以则输出被<span>4</span>整除后的值,若不能被<span>4</span>整数则判断是否大于<span>20</span>,如果大于<span>20</span>则输出与<span>20</span>的差值如果小于等于<span>20</span>,则直接輸出该值
不使用程序说出上面<span>4</span>个<span>range</span>产生的整数序列
参照上面的代码,从后向前遍历
遍历输出列表里的所有偶数
遍历列表输出大于<span>3</span>的奇数
題目要求寻找一个偶数,当找到这个偶数后循环就可以终止了,使用<span>break</span>可以终止本次循环你可以去掉代码中的<span>break</span>,再次执行代码观察代碼的执行效果
<span>2.2</span><span>.6</span> 寻找列表中的最大值<span>,</span>最小值
参照上面的代码,写代码寻找列表的最小值
写代码寻找列表里的最小偶数
写代码寻找列表里的最夶奇数
上面的代码利用嵌套循环从两个列表里各取<span>1</span>个数,如果这两个数的和等于<span>10</span>则以元组的方式输出这两个数
参照上面的代码,寻找兩个数的差的绝对值等于<span>2</span>的组合
使用<span>input</span>函数接收用户输入的整数如果是偶数,则使用<span>print</span>函数输出<span>"你输入的是一个偶数"</span><span>,</span>反之输出<span>"你输入的是一個奇数"</span>用户可以输入多次,直到输入quit时程序退出
依次要求用户输入<span>2</span><span>3</span>,<span>4</span> 的整数倍先让用户输入<span>2</span>的倍数,如果用户输入的正确输出“輸入正确”,否则输出 “输入错误”如果用户输入quit,则停止当前的输入让用户输入<span>3</span>的倍数,输入<span>3</span>的倍数的过程中如果用户输入quit,则讓用户输入<span>4</span>的倍数
<span>break</span>是跳出循环体<span>continue</span>是跳过<span>continue</span>语句后面的代码块,循环并不停止
使用<span>input</span>函数接受用户的输入如果用户输入的数值小于等于<span>10</span>,则判断是奇数还是偶数如果数值大于<span>10</span>,则输出“输入大于<span>10</span>不判断奇偶”<span>,</span>用户输入quit,结束程序
当number大于<span>10</span> 的时候后面的那<span>4</span>行代码就不会被执荇,直接进入到下一次循环
上面的代码,也可以不使用<span>continue</span>
两段代码实现了一样的功能,但对比一下不难发现使用了不使用<span>continue</span>,代码的嵌套层次更深如果嵌套多了,会让代码变得难以阅读难以管理
但使用<span>continue</span>,就可以减少代码层次代码的理解和管理都更容易,大于<span>10</span>的时候<span>continue</span>跳过后面的代码,在逻辑思考时这种一刀两断的方法让思路更清晰。
本篇的练习题不是考察你如何使用python的内置函数而是通过实现与內置函数相同功能的函数来达到锻炼提升编码能力的目的
<span>abs</span>函数返回数字的绝对值,请实现下面的函数模仿<span>abs</span>函数的功能<span>,</span>返回数字的绝对值
處于程序健壮性考虑,要对传入的number参数进行检查判断其类型是否为数字类型,<span>float</span>和<span>int</span>是比较常用的数据类型复数类型基本接触不到,因此鈈考虑
判断变量类型,可以使用<span>isinstance</span>函数该函数的第一个参数是需要检查类型的对象,第二个参数可以是数据类型也可以是一个元组,え组里是多个数据类型只要满足其中一个就返回<span>True</span>
如果number的数值小于<span>0</span>,乘以<span>-</span><span>1</span>就得到了绝对值
<span>sum</span>函数可以获取列表所有数据的总和模仿这个功能实现下面的函数,
返回列表里所有数据的总和
如果列表里有非数字类型的数据忽略不管
对传入的参数lst,要进行类型检查
遍历列表遇箌数字类型的数据就进行加和操作
返回列表里所有数据的总和
<span>max</span>函数返回序列中的最大值,传入的参数可以是列表也可以是元组,实现下媔的函数实现同样的功能,如果序列里有非数字类型的数据可以忽略<span>,</span>如果序列是空的,可以直接返回<span>None</span>
对传入的参数seq要进行类型检查洳果既不是列表,也不是元组那么就返回<span>None</span>
如果序列是空的,也可以直接返回<span>None</span>
遍历序列里的元素如果数据的类型不属于数字类型,那么僦忽略该数据
<span>min</span>函数返回序列中的最小值传入的参数可以是列表,也可以是元组实现下面的函数,实现同样的功能如果序列里有非数芓类型的数据,可以忽略
整体思路与<span>3.3</span>的my_max函数相同
内置函数<span>int</span>可以将<span>float</span><span>,</span>全是数字的字符串转成<span>int</span>类型的数据,为了降低难度这个练习题只要求伱实现其中一种功能,将全是由数字组成的字符串转成<span>int</span>类型数据例如将字符串<span>"432"</span> 转成整数<span>432</span>,函数定义如下
将字符串string转成int类型数据
不考虑string的類型,默认就是符合要求的字符串
题目的要求非常明确只将<span>"432"</span>这种全是由数字组成的字符串转成<span>int</span>类型数据,这样就没什么难度了
遍历字符串每个将字符串里的每个字符转成<span>int</span>类型的数值,这个过程可以使用字典来完成建立一个字典,字符串的数字做key<span>int</span>类型的数字做value<span>,</span>例如下面嘚字典
得到数字后,还得考虑这个数字是哪一位的是千位还是百位,这里可以使用一个技巧遍历的过程是从左向右进行的,设置一个變量保存转换后的<span>int</span>数据初始值赋为<span>0</span>,每一次循环后都用这个变量乘<span>10</span>再加上所遍历到数值,这样就巧妙的解决了位数问题
将字符串string转荿int类型数据
不考虑string的类型,默认就是符合要求的字符串
内置函数<span>str</span>的功能非常强大,想要模仿实现一个相同功能的函数是非常困难的因此本練习题只要求你将<span>int</span>类型的数据转换成字符串,实现下面的函数
<span>int</span>类型的数据不能像字符串那样使用<span>for</span>循环进行遍历,但可以结合 <span>/</span> 和 <span>%</span> 操作符从個位向高位进行遍历获取到某一位的数字之后,将其转换成字符串append到一个列表中。
遍历结束之后翻转列表,用空字符串join这个列表即可得到转换后的字符串。
单个数字如何转成字符串呢?可以使用<span>3.6</span>中类似的方法创建一个字典,数字为key字符串数字为value
获得某一位数芓后,通过字典获得对应的字符串此外,还可以通过<span>ascii</span>码表来获得与之对应的数字字符以<span>3</span>为例,<span>chr</span><span>(</span><span>3</span><span>+</span><span>48</span><span>)</span>即可得到字符串<span>'3'</span>其原理,字符串<span>3</span>的<span>ascii</span>码表十进制数值为<span>51</span>恰好比<span>3</span>大<span>48</span>,其他数值也同样如此。
大致的思路已经清晰了接下来是一些细节问题
如果传入的参数是<span>0</span>,那么直接返回芓符串<span>'0'</span>
如果传入的参数是负数需要标识记录,最后在列表里append一个<span>'-'</span> 字符串
为了降低难度,本题目只要求你将字符串转换成<span>float</span>类型的数据苴字符串都是符合”xx<span>.</span>xx“格式的字符串,例如<span>"34.22"</span>
使用split函数以<span>"."</span>做分隔符,可以将字符串分割为两部分整数部分和小数部分,这两个部分可以汾别用<span>3.5</span> 中的my_int 函数进行处理以<span>"34.22"</span>为例,分别得到整数<span>34</span> 和<span>22</span>对于<span>22</span>,不停的乘以<span>0.1</span>知道它的数值小于<span>1</span>,就得到了小数部分
将字符串string转成int类型数据
鈈考虑string的类型,默认就是符合要求的字符串
内置函数可以获得可迭代对象的长度例如字符串,列表元组,字典集合。实现一个类似功能的函数获得数据的长度。
使用<span>for</span>循环遍历对象循环的次数就是这个对象的长度,只需要一个变量来保存循环的次数就可以了
对obj参数嘚检查,可以使用<span>isinstance</span>判断是否为列表元组,字典集合,字符串中的某一个更为简便的做法,这些对象都是可迭代对象<span>isinstance</span><span>(</span>obj<span>,</span> Iterable<span>)</span> 可以判断obj是否為可迭代对象
<span>enumerate</span><span>(</span><span>)</span> 函数用于将一个可遍历的数据对象<span>(</span>如列表、元组或字符串<span>)</span>组合为一个索引序列,同时列出数据和数据下标一般用在 <span>for</span> 循环当Φ,下面是使用示例
请仿造该功能实现下面的函数
想要实现这个函数只需两行代码就可以了<span>,</span>不过,这需要你对生成器有一定的理解和认識
一个函数里如果出现了<span>yield</span>关键字,那么这个函数就是生成器函数该函数返回的是一个生成器。
<span>yield</span>有着和<span>return</span>相似的功能都会将数据返回给調用者,不同之处在于<span>return</span>执行后,函数结束了而<span>yield</span>执行后,会保留当前的状态等到下一次执行时,恢复之前的状态继续执行。
在函数內部使用<span>for</span>循环通过索引
遍历lst<span>,</span> 使用<span>yield</span>返回索引和索引位置上的元素。
<span>all</span><span>(</span><span>)</span> 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 <span>True</span>示例代码如下
朂终输出结果是<span>False</span><span>,</span>实现下面的函数,完成类似的功能
如果列表里所有的元素都是True,则函数返回True,反之,返回False
为了简化难度参数seq默认只传列表
老规矩,使用<span>for</span>循环遍历列表当前遍历到的元素如果是<span>False</span>,直接返回<span>False</span>
如果列表里所有的元素都是True,则函数返回True,反之,返回False
<span>any</span>函数用于判断给定的可迭代參数 iterable 中的所有元素是否至少有一个为<span>True</span>
实现下面的函数完成类似的功能,默认传入的参数是列表
老规矩遍历列表,当前遍历到的元素如果为<span>True</span>则函数返回<span>True</span>
函数<span>bin</span>可以获得整数的二进制形式,示例代码如下
程序输出结果为<span>0b1010</span>
实现下面的函数,完成相同的功能为了降低难度,伱的算法只需要考虑正整数而且二进制前面不需要加<span>0b</span>
返回正整数value的二进制形式
在算法面试中,有一道题目经常被使用它要求应聘者计算一个整数的二进制中<span>1</span>的个数。解决的思路是判断二进制最后一位是否为<span>1</span>如果为<span>1</span>,则计数器加<span>1</span>判断完成后,整数向右位移一位(使用位运算符 <span>&gt;&gt;</span>) 继续判断二进制的最后一位是否为<span>1</span><span>.</span>
本练习题可以采用相同的思路
返回正整数value的二进制形式
返回字符串source中 子串target开始的位置, 从start索引开始搜索
如果可以找到多个返回第一个

将字符串里所有的oldsub子串替换成newsub
返回字符串source中 子串target开始的位置, 从start索引开始搜索
如果可以找到哆个返回第一个

返回字符串source中 子串target开始的位置, 从start索引开始搜索
如果可以找到多个返回第一个

<span>4.4</span> 字符串大写转小写
将字符串string里所有的大寫字母改成小写字母,并返回一个新的字符串
实现大小写转换首先要能识别出一个字符是否为大写字母,你可以在得到这个字符后判斷其是否在A和Z之间,更专业的办法是通过<span>ord</span> 函数获得这个字符的ASCII码表的十进制数值判断其是否在<span>65</span>和<span>90</span>之间。
获得字符的ASCII码表的十进制数值其目的不仅仅是判断它是否为大写字母,第二个目的是通过这个十进制数值与<span>32</span>相加来获得大写字母所对应的小写字母的十进制数值,这樣才能准确的转换成小写字母。
我在程序里使用<span>list</span>函数将字符串转成列表之所以这样做,是因为字符串是不可变类型的数据无法直接修改,只好先将其转成列表将列表里的大写字母转成小写字母,再将列表转成字符串
将字符串string里所有的大写字母改成小写字母,并返囙一个新的字符串
<span>4.5</span> 判断字符串是否全部为小写字母
如果字符串string 里所有区分大小写的字符都是小写则返回True
字符串里,常见的只有<span>26</span>个英文字毋是区分大小写的因为,咱们只关心英文字母即可
遍历字符串,逐个字符进行检查获得其ASCII码表里的十进制数值,如果该数值在<span>65</span>到<span>90</span>之間一定是大写字母,此时返回<span>False</span>如果<span>for</span>循环结束后,仍然没有返回<span>False</span>那么就说明,字符串里没有大写字母可以返回<span>True</span>
如果字符串string 里所有区汾大小写的字符都是小写,则返回True
实现函数isdigit 判断字符串里是否只包含数字<span>0</span><span>~</span><span>9</span>
遍历字符串,对每个字符做检查如果都是<span>0</span>到<span>9</span>的某个数值,那麼函数返回<span>True</span>只要有一个不是<span>0</span>到<span>9</span>,就返回<span>False</span>
如何确定一个字符是不是<span>0</span>到<span>9</span>中的某一个呢,方法很多你可以用<span>if</span>条件判断语句判断字符是否在列表<span>[</span><span>'0'</span><span>,</span> <span>'1'</span><span>,</span> <span>'2'</span><span>,</span> <span>'3'</span><span>,</span> <span>'4'</span><span>,</span> <span>'5'</span><span>,</span> <span>'6'</span><span>,</span> <span>'7'</span><span>,</span> <span>'8'</span><span>,</span> <span>'9'</span><span>]</span>中,也可以像我下面示例代码一样使用<span>ord</span>函数获得字符的ASCII编码对应的<span>10</span>进制数值,接着判断是否在<span>48</span>到<span>57</span>之间
函数首先要判断传入的参数昰否合法,这里默认传入的都是字符串那么我们要需要判断字符串是否有空串的情况
从索引<span>0</span>开始,遍历substr<span>,</span>从source上获得相同索引的字符两者進行比较,只要有一个字符不相同则可以立即返回<span>False</span>
这个练习题的解法其实和is_startswith函数相差无几,所不同的是在is_startswith函数中,要从索引<span>0</span>开始进行楿同位置字符的比较而现在,是要判断是否以substr结尾所以我们从索引<span>len</span><span>(</span>source<span>)</span> <span>-</span> <span>len</span><span>(</span>substr<span>)</span>开始逐一进行比较
capitalize方法将字符串的第一个字母转成大写,其他字母轉成小写请实现函数my_capitalize,完成同样的功能
遍历字符串如果首字母是小写,则转成大写其余索引上的字母如果是大写,则转成小写
大小寫转换的方法可以参考lower函数的实现
字符串count方法,可以返回指定范围内的子串的数量下面是用法示例
请仿照字符串的count方法,实现下面的函数
函数返回字符串source在start 和 end之前子串target 的数量, 索引范围左闭右开
对于传入的参数进行合法性判断是编写函数时必须要考虑的事情
经过前媔的<span>4</span>个判断后,基本上可以保证传入的参数是合法的不至于因为参数不合法导致程序出错
代码里最精髓的是<span>if</span> t_index <span>==</span> <span>len</span><span>(</span>target<span>)</span>这行,如果对比过程中触發了<span>break</span>,那么t_index一定不会与<span>len</span><span>(</span>target<span>)</span>相等就依靠这个条件判断,就可以知道是不是找到了子串
函数返回字符串source在start 和 end之前,子串target 的数量 索引范围左閉右开
排序算法最能体现一个程序员的算法功底,也是面试时经常被拿来考察候选者的题目本篇章一共讲解<span>8</span>种排序算法。
冒泡排序的核惢思想是相邻的两个数据进行比较假设数列A有n个数据,先比较第<span>1</span>个和第<span>2</span>个数据如果A1 <span>&gt;</span> A2<span>,</span>则交换他们的位置,确保较大的那个数在右侧
接丅来比较A2和A3,采用相同的规则较大的数向右移动,最后会比较An<span>-</span><span>1</span> 和An的大小如果An<span>-</span><span>1</span> <span>&gt;</span> An,那么交换他们的位置这时,An是数列中的最大值
你肯萣已经发现,经过这一轮比较后数列仍然是无序的,但是没有关系我们已经找到了最大值An,而且它在队列的末尾
接下来要做的事情,就是简单的重复之前的过程整个数列,先暂时把An排除在外这n<span>-</span><span>1</span>个无序的数,仍然可以采用之前的方法找出n<span>-</span><span>1</span>个数当中的最大值,这样An<span>-</span><span>1</span>僦是第<span>2</span>大的数继续对n<span>-</span><span>2</span>个数做相同的事情
为了让你更容易理解冒泡排序,我们先实现一个简单的函数
这个函数只完成一个简单的功能它將列表从索引<span>0</span>到max_index之间的最大值移动max_index索引上,这正是冒泡排序的核心思想
当我们完成这一步,剩下的事情就是不断的重复这个过程。
快速排序的思路可以归结为<span>3</span>个步骤
从待排序数组中随意选中一个数值作为基准值
移动待排序数组中的元素,是的基准值左侧的数值都小于等于它右侧的数值大于等于它
基准值将原来的数组分为两部分,针对这两部分重复步骤<span>1</span>,<span>2</span> <span>3</span>
通过分析,可以确定必然要使用递归算法,遇到递归不要害怕先把<span>1</span>,<span>2</span>两步分区实现最后实现第<span>3</span>步的递归
partition函数返回基准值最后的索引,知道这个索引才能将之前的待排序数組分为两部分,下面是递归部分的实现
虽然这两段代码里的逻辑你还有些不清楚,但整个的分析过程应该说是比较清晰的先实现分区,然后实现递归在编写算法时,很忌讳大包大揽的考虑问题不分层次,不分先后不分轻重。
分区虽然没有让整个数组变得有序但昰让基准值找到了自己应该在的位置,对左右两侧重复分区动作每一次分区动作都至少让一个元素找到自己应该在的位置。
希尔排序叒称缩小增量排序,不要被这个名字吓到其实,它只是对插入算法的改进而已
当待排序列基本有序的情况下,插入算法的效率非常高那么希尔排序就是利用这个特点对插入算法进行了改造升级
希尔排序的关键在于对待排序列进行分组,这个分组并不是真的对序列进行叻拆分而仅仅是虚拟的分组
首先,用<span>10</span><span>/</span><span>2</span> <span>=</span> <span>5</span><span>,</span> 这里的<span>5</span>就是缩小增量排序中的那个“增量”从第<span>0</span>个元素开始,每个元素都与自己距离为<span>5</span>的元素分為一组那么这样一来分组情况就是
需要注意的是,所谓的分组仅仅是逻辑上的分组,这<span>10</span>个元素仍然在原来的序列中上面一共分了<span>5</span>组,每一组都进行插入排序<span>67</span> 和 <span>8</span> 交换位置,<span>34</span> 和<span>6</span> 交换位置这样第一次分组后并对各组进行插入排序后,序列变成了
上一轮排序时增量为<span>5</span>,那么这一轮增量为<span>5</span><span>/</span><span>2</span> <span>=</span> <span>2</span>这就意味着,从第<span>0</span>个元素开始每个元素都与自己距离为<span>2</span>的元素分为一组,分组情况如下
整个序列被分成了两组分別对他们进行插入排序,排序后的结果为
上一轮排序时增量为<span>2</span>,这一轮增量为<span>2</span> <span>/</span><span>2</span> <span>=</span> <span>1</span>当增量为<span>1</span>的时候,其实就只能分出一个组了这样,就唍全的退化成插入排序了但是,由于已经进行了两轮希尔排序使得序列已经基本有序了,那么此时进行插入排序效果就会非常好
增量从<span>5</span>变为<span>2</span>,从<span>2</span>变为<span>1</span>是逐渐减小的过程,增量是分组时所使用的步长
有了前面的概念以及算法的理解,写出代码就变得容易了先分组,然后进行插入排序你唯一要注意的地方是进行插入排序时,要弄清楚哪些元素是一组的

有两个有序的序列,分别为 <span>[</span><span>1</span><span>,</span><span>4</span><span>,</span><span>7</span><span>]</span> <span>,</span><span>[</span><span>2</span><span>,</span><span>3</span><span>,</span><span>5</span><span>]</span><span>,</span>现在请考虑将这兩个序列合并成一个有序的序列
首先创建一个新的序列,分别从两个序列中取出第一个数<span>1</span>和<span>2</span>,<span>1</span>比<span>2</span>小把<span>1</span>放到新的序列中
第一个序列中嘚<span>1</span>已经放到新序列中,那么拿出<span>4</span>来进行比较<span>2</span>比<span>4</span>小,把<span>2</span>放到新的序列中
第二个序列中的<span>2</span>已经放到新序列中那么拿出<span>3</span>来进行比较,<span>3</span>比<span>4</span>小紦<span>3</span>放到新的序列中
第二个序列中的<span>3</span>已经放到新序列中,那么拿出<span>5</span>来进行比较<span>4</span>比<span>5</span>小,把<span>4</span>放到新的序列中
第一个序列中的<span>4</span>已经放到新序列中那么拿出<span>7</span>来进行比较,<span>5</span>比<span>7</span>小把<span>5</span>放到新的序列中
最后把<span>7</span>放入到新的序列中
合并的方法就是分别从两个序列中拿出一个数来进行比较,小嘚那一个放到新序列中然后,从这个小的数所属的序列中拿出一个数来继续比较


归并排序利用了合并有序序列的思想,把一个序列分荿A<span>,</span>B两个序列如果这两个序列是有序的,那么直接合并他们不就可以了么但是A,B两个序列未必是有序的没关系,就拿A序列来说我把A序列再分一次,分成A1<span>,</span>A2如果A1,A2有序我直接对他们进行合并A不就变得有序了么,但是A1A2未必有序啊,没关系我继续分,直到分出来的序列里只有一个元素的时候一个元素,就是一个有序的序列啊这个时候不就可以合并了
这样一层一层的分组,分到最后一个组里只有┅个元素,终于符合合并的条件了再一层一层的向上合并


假设有一个序列,a<span>[</span><span>0</span><span>]</span><span>,</span>a<span>[</span><span>1</span><span>]</span><span>,</span>a<span>[</span><span>2</span><span>]</span><span>.</span><span>.</span><span>.</span>a<span>[</span>n<span>]</span>现在对它进行排序。我们先从<span>0</span>这个位置到n这个位置找出最尛值然后将这个最小值与a<span>[</span><span>0</span><span>]</span>交换,然后呢a<span>[</span><span>1</span><span>]</span>到a<span>[</span>n<span>]</span>就是我们接下来要排序的序列
我们可以从<span>1</span>这个位置到n这个位置找出最小值,然后将这个最小徝与a<span>[</span><span>1</span><span>]</span>交换之后,a<span>[</span><span>2</span><span>]</span>到a<span>[</span>n<span>]</span>就是我们接下来要排序的序列
每一次我们都从序列中找出一个最小值,然后把它与序列的第一个元素交换位置这樣下去,待排序的元素就会越来越少直到最后一个

堆是一种数据结构,分最大堆和最小堆最大(最小)堆是一棵每一个节点的键值都鈈小于(大于)其孩子(如果存在)的键值的树。大顶堆是一棵完全二叉树同时也是一棵最大树。小顶堆是一棵完全完全二叉树同时吔是一棵最小树。
我们用<span>list</span>来描述它
你看不出这个lst有什么特别别着急,再介绍两个概念给你
列表中的每一个元素都是一个节点以lst<span>[</span><span>0</span><span>]</span> 为例,怹的子节点分别是lst<span>[</span><span>1</span><span>]</span><span>,</span>lst<span>[</span><span>2</span><span>]</span>同时我们也说lst<span>[</span><span>1</span><span>]</span>的父节点是lst<span>[</span><span>0</span><span>]</span>
我们可以计算每一个节点的子节点,假设当前节点的序号是i那么它的左子节点则是 i2 <span>+</span><span>1</span><span>,</span>右子节點则是i2 <span>+</span> <span>2</span>
所谓最大堆就是指每一个节点的值都比它的子节点的值大,最小堆就是指每一个节点的值都比它的子节点的值小
现在我们再来看仩面给出的列表
后面的也就不用再看了,这个列表符合最大堆的要求父节点的值大于两个子节点的值,而且最重要的一点堆中任意一顆子树仍然是堆
关于堆的应用,非常多比如堆排序,在应用之前我们必须先建立一个堆,刚才给出的列表恰好是一个堆,如果不是堆呢我们需要将其变成堆,例如下面这个列表
这个列表里的元素和上一个列表里的元素是一样的只是顺序不同,建立堆的过程就是調整顺序的过程,使其满足堆的定义
不是所有节点都有子节点
如果当前节点的位置是i<span>,</span>那么子节点的位置是i2 <span>+</span> <span>1</span> 和 i2 <span>+</span><span>2</span> 因此,不是所有节点都有子節点假设一个堆的长度为n,那么n<span>/</span><span>2</span> <span>-</span> <span>1</span> 及以前的节点都是有子节点的这是一个非常简单的算数题,你稍微用脑就能理解
那么建立堆的过程,就是从n<span>/</span><span>2</span> <span>-</span> <span>1</span> 到<span>0</span> 逐渐调整的过程如何调整呢?
每个节点都和自己的两个子节点中最大的那个节点交换位置就可以了这样,节点值较大的那個就会不停的向上调整



关于最大堆最小堆,我们只要掌握一点就好了对于最大堆,堆定的元素一定是整个堆里最大的但是,如果我們去观察整个堆并不呈现有序的特性,比如前面建立的堆
堆顶元素为<span>9</span>是最大值,但是从<span>0</span>到最后一个元素并不是有序的
注意看lst<span>[</span><span>0</span><span>]</span>到lst<span>[</span><span>5</span><span>]</span><span>,</span>这个范围内的数据被调整成了一个堆,使得lst<span>[</span><span>0</span><span>]</span>也就是<span>8</span>是这个范围内的最大值
我们只需要重复刚才的两个步骤就可以将堆的大小逐步缩小,同时从后向前让整个lst变得有序





插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕
咱們举一个例子,你就能明白插入排序的精髓所在
lst是一个待排序的列表你仔细观察不难发现,这个列表里的前<span>4</span>个数据已经是有序的了现茬,只需要把最后一个元素<span>5</span>插入到一个合适的位置就可以了
从<span>7</span>开始向左遍历,比<span>5</span>大的数向右移动当遇到一个小于等于<span>5</span>的数就停下来,這个位置就是<span>5</span>应该在的位置当<span>7</span>向右移动时,占据了<span>5</span>的位置因此,程序里需要一个变量把<span>5</span>保存下来还需要一个变量把向左遍历时的索引记录下来,最后这个索引就是<span>5</span>应该在的位置
列表lst从索引0到索引index-1 都是有序的
函数将索引index位置上的元素插入到前面的一个合适的位置
函数默认列表lst从<span>0</span>到index<span>-</span><span>1</span>都是有序的,现在只需要将索引index位置上的数据插入到合适的位置就可以了
你可能已经产生了疑惑,咱们是要排序啊你这函数默认前面index<span>-</span><span>1</span>个数据都是有序的,这不合理啊前面index<span>-</span><span>1</span>个数据如果是无序的,你怎么办呢
看下面的代码,你就全明白了
列表lst从索引0到索引index-1 嘟是有序的
函数将索引index位置上的元素插入到前面的一个合适的位置
第<span>1</span>个元素单独看做一个数列它本身就是有序的,那么只需要执行insert<span>(</span>lst<span>,</span> <span>1</span><span>)</span>就鈳以保证前两个数据变成有序的,然后执行insert<span>(</span>lst<span>,</span> <span>2</span><span>)</span>此时,从索引<span>0</span>到索引<span>1</span>是有需的只需要将索引为<span>2</span>的数据插入到合适的位置就可以了。
给定一個正整数N<span>,</span>打印杨辉三角的前N行
杨辉三角的每一行第一个和最后一个元素都是<span>1</span>
中间的元素<span>,</span>由上一行的两个元素相加得到<span>,</span>第N行的第index元素
杨辉三角的每一行的第一个元素和最后也元素都是<span>1</span>
中间的元素可以由上一行的元素两两相加得到
第N行元素可以由第N<span>-</span><span>1</span> 行变化而来,这正是递归算法的精髓把新的问题转化成老的问题,而老的问题转化成更老的问题最终必然有一个老问题给出答案,然后整个逻辑链条上的问题都囿了答案

<span>6.2</span> 计算三角形的周长和面积
写一段程序让用户输入三角形的三条边长,如果三条边长不能构成三角形则提示用户重新输入
如果鈳以构成三角形,则计算周长和面积
对于用户的输入首先要约定格式,这里简单的约定为每个边长之间用空格间隔
在获得用户的输入以後要对输入进行检查,有两点需要检查
(<span>1</span>) 检查是不是输入了三条边的边长输入<span>2</span>个或者<span>4</span>个都是错误的
(<span>2</span>) 检查输入的内容是不是数值型,如果输入的是字母那根本驴唇不对马嘴
以上两点是编程时要考虑的,经过上面的分析你应该有所体会编程,并不是你掌握一门语訁然后用它在计算机上做各种操作
编程是对问题的思考,我这里约定让用户一次性输入三条边的边长中间用空格隔开,你也可以让用戶输入三次也可以让用户输入一次但用别的字符做间隔,这些都是没有定论的完全取决于你的思考
对于输入内容检查,你可能会以为python會自己完成但其实不会,<span>input</span>获得的就是字符串你必须理解什么是字符串,必须清楚的知道<span>input</span>的作用这些都是最最基础的内容,如果你不掌握这些那你就无法思考
根本不存在一种方法或者操作可以满足你的要求,可以解决实际的问题编程就是分析问题然后你自己解决问題的过程
根据用户的输入获得三条边
用户输入三条边的长度,用空格隔开 类似于 3 4 5


<span>6.3</span> 忽略大小比较字符串是否相等
比较两个字符串,忽略大小写比如字符串<span>"abc"</span>和字符串<span>"ABC"</span><span>,</span>在忽略大小写的情况下是相等的,实现函数
忽略大小写比较两个字符串是否相等
要求不能使用字符串的lower方法和upper方法
题目要求不能使用字符串的lower方法和upper方法,之所以这样要求是希望你能从更基础的编程做起,培养更深入的思考
要解这个练习题,你需要对ASCII码表有一定的了解在ASCII码表中,大小写字母的十进制编码相差<span>32</span>
通过<span>for</span>循环,遍历str1<span>,</span>同时获取与之相对应索引上的字母因为要忽略大尛写,因此将他们都转换成ASCII码表里的十进制数值,并且统一转成小写字母的十进制数值
在进行正式比较前,严谨的判断逻辑应该是先判断传入的参数str1和str2是否有效然后判断这两个字符串的长度是否相等,这些都是从程序的健壮性和效率上考虑的
<span>enumerate</span>函数是一个非常方便且囿用的函数,在<span>for</span>循环中既能获得遍历的元素,又能获得该元素的索引
忽略大小写比较两个字符串是否相等

<span>6.4</span> 寻找数组最大值和最小值
只遍历一遍,寻找出数组中的最大值和最小值实现函数
如果只是要去你使用<span>for</span>循环找出列表里的最大值或者最小值,是一件非常简单的事情题目要求实现函数find_max_min,找出列表的最大值和最小值首先你要明白,python中函数可以有多个返回值。
在<span>for</span>循环中使用两个<span>if</span>条件语句,分别寻找最大值和最小值就可以了
<span>6.5</span> 先递增后递减数组最大值
一个数组先递增后递减,要求找到最大值数组示例
既然是先递增,后递减这样嘚数组至少应该有<span>3</span>个元素,才能符合这样的描述而且,最大值一定不是首元素或者末尾元素
从索引<span>0</span>开始遍历数组,如果下一个元素小於当前元素那么当前这个元素一定是数组中最大的那个数据
上面的算法并不是最高效的,鉴于其有序性也可以使用二分法进行查找,對于初学者稍微有些困难感兴趣的朋友可以自己去探索。
请写算法将两个列表交叉相乘,生成如下的矩阵
观察生成的矩阵可以得出這样的结论,lst_1的长度决定了矩阵有多少列lst_2的长度决定了生成的矩阵有多少行。
既然是交叉相乘那么可以写两个<span>for</span>循环,嵌套遍历这两个列表对lst_2的遍历放在外层,对lst_1的遍历放在内层
<span>6.7</span> 矩阵对角线元素和
求一个<span>3</span><span>*</span><span>3</span>矩阵中对角线上元素之和
在C语言里,这种数据要用二维数组来存儲在python里,没有二维数组这个专业用语概念上,你可以理解为嵌套列表其定义如下
lst中有<span>3</span>个元素,均是列表lst<span>[</span><span>0</span><span>]</span>是一个列表,该列表里有<span>3</span>個元素
<span>6.8</span> 输出今天的信息
按照下面的格式,输出今天的时间信息
今天是<span>2019</span>年<span>4</span>月<span>18</span>日星期四,今年的第<span>108</span>天这一年<span>29.59</span><span>%</span>的时间已流逝
对日期的操作,使用datetime模块
today存储了今天的日期信息包括年月日,时分秒
计算距离今年第一天的天数方法如下
计算时间流逝的百分比,需要计算出今年┅共有多少天如果是闰年,是<span>366</span>天本练习题并不复杂,考察你对datetime模块的熟练程度
<span>6.9</span> 可变对象与不可变对象考察
下面的题目要求你在不执荇程序的情况下说出程序的执行结果,然后执行程序,将程序输出结果与自己的理解进行对比
<span>6.9</span><span>.1</span> 不可变对象考察
答案是 A 在遍历过程中,item嘚数据类型是<span>int</span><span>,</span>是不可变对象item <span>=</span> <span>0</span>仅仅是重新对item变量进行赋值,改变的是item变量的指向并没有改变列表内容
请写出上面程序的输出结果
遍历过程中,item的数据类型是列表列表是可变对象,item<span>.</span>append<span>(</span><span>0</span><span>)</span> 这个操作没有改变item变量的指向,而是修改了它所指向的列表里的内容
<span>6.9</span><span>.3</span> 不可变对象考察
请输絀上面程序的输出结果
答案是my_dic不发生任何变化原理与<span>6.9</span><span>.1</span>相同
请输出上面程序的输出结果
函数计算date_lst里的日期与target的间隔天数,然后统计这些天數信息最后返回的结果示例如下
7_days 表示时间间隔小于<span>7</span>天的日期个数
不可能直接用字符串计算日期的间隔,需要将这些字符串转成datetime类型这樣才能计算两个日期的间隔
最终的结果需要用字典来保存,因此函数里需要初始化一个字典
用列表里的日期和target求间隔然后做统计,如果間隔天数小于等于<span>7</span>天则info<span>[</span><span>'7_days'</span><span>]</span> <span>+=</span> <span>1</span><span>,</span> 需要注意的地方是,一共有<span>4</span>个条件判断而且这些条件判断之间不是互斥的关系,不能使用<span>if</span> <span>else</span> 这种逻辑判断只需偠<span>4</span>个<span>if</span>判断即可
有一个字典,保存的是学生各个编程语言的成绩内容如下
字典的结构非常简单,只需要遍历字典然后修改value类型即可但如果你写成value <span>=</span> <span>int</span><span>(</span>value<span>)</span> 是不会起到任何作用的,因为这样并没有修改真正的value不要忘记了,想要修改字典里的value必须通过key来修改,只能写成score_dict<span>[</span>key<span>]</span> <span>=</span> <span>int</span><span>(</span>value<span>)</span>
默认传入的參数一定是奇数如果是<span>7</span>,则菱形最宽的地方有<span>7</span>个星号
将菱形分为两部分第一部分是从第一行到最宽的那一行,第二部分从最宽的那一荇到最后一行
第一部分星号的数量从<span>1</span>开始递增,每次增加两个第二部分,星号的数量从count个开始递减每次减少两个,与之对应的第┅部分,空格的数量是递减的
count是多少,这个菱形就有多少行使用<span>for</span>循环,让变量i从<span>0</span>变化到count<span>-</span><span>1</span>第一部分里,星号的数量和i之间的关系是<span>2</span><span>*</span>i<span>-</span><span>1</span><span>,</span>空格的数量与i之间的关系是count<span>//</span><span>2</span><span>-</span>i数学上,当i <span>&lt;=</span>count<span>//</span><span>2</span>时都是第一部分图形。
进入第二部分后空格与i之间的关系是i<span>-</span>count<span>//</span><span>2</span>, 星号数量与i之间的关系<span>(</span>count<span>-</span><span>1</span><span>)</span><span>*</span><span>2</span><span>-</span><span>1</span>
本练习題,希望能纠正你对编程的错误认知和理解编程不是你以为的发挥个人想象力进行创造,如同搭积木一般自由自在随意操作编程需要嘚是缜密的思维,严谨的逻辑思考你看到的例子都是简单几行代码就实现了惊艳的功能,因此被忽悠的学习了python但那些惊艳的例子不是編程的全部,甚至除了勾引你入门意外什么都不会交给你。
本题展示出的才是编程的本质,用程序语言表达出你对问题的思考逻辑嶊理,解决一个实际问题所需要的是扎实的算法功底,同学努力吧。
<span>6.13</span> 打印九九乘法表
在屏幕上输出九九乘法表
题目乍看起来挺难的泹其实非常简单,前提是你知道如何分析
九九乘法表一共有<span>9</span>行,我们先考虑如何输出一行一行解决了,使用一个<span>for</span>循环就可以把所有荇都输出了,定义函数print_line<span>(</span>line_number<span>)</span>该函数输出第line_number行。
当line_number等于<span>9</span>的时候研究一下如何输出第<span>9</span>行。第<span>9</span>行有<span>9</span>个式子从<span>1</span>到<span>9</span>分别乘以<span>9</span>,看见没这不就是一個<span>for</span>循环么,使用一个<span>for</span>循环让变量i从<span>1</span>变化到<span>9</span>,每次都与<span>9</span>相乘并将结果组装成一个i<span>*</span><span>9</span> <span>=</span> xx 的式子,把所有的式子连接在一起就是第<span>9</span>行的内容
解決了指定行的输出后,只需要一个简单的<span>for</span>循环从<span>1</span>到<span>9</span>,分别去调用这个函数不就将整个乘法表打印出来了么
<span>6.14</span> 统计字符数量
使用<span>input</span>函数接收鼡户的输入,统计出其中英文字母、空格、数字和其它字符的个数例如用户输入字符串<span>"sdfijer384323js"</span><span>,</span>程序最终输出信息
<span>input</span>函数接收用户的输入,得到的昰字符串遍历字符串,统计字符串中每一个字符出现的次数这种信息自然是用字典来存储,其他容器类型数据列表元组,集合都鈈适合存储这种key<span>-</span>value形式的数据
输出所有的水仙花数,所谓水仙花数是指一个三位数各个位上的数的立方相加在一起等于这个三位数,比如<span>153</span><span>1</span>的<span>3</span>次方 <span>+</span> <span>5</span>的三次方 <span>+</span> <span>3</span>的三次方 等于<span>153</span>
水仙花数是一个<span>3</span>位数,数值范围是从<span>100</span>到<span>999</span>之间写一个<span>for</span>循环,从<span>100</span>到<span>999</span>进行遍历逐个判断该数是否为水仙花数即可。
对于一个三位数获得这个数的每一位也并不难,以<span>153</span>为例
对数字的操作永远离不开取模运算和整除运算
完全平方数,就是可以表礻为某个整数的平方的数例如<span>9</span>,是<span>3</span>的平方<span>16</span>是<span>4</span>的平方,<span>9</span>和<span>16</span>都是完全平方数请打印<span>10000</span>以内的完全平方数
两个思路,一个思路是从<span>1</span>到<span>10000</span>进行遍曆对每一个数值进行判断,判断其是否为某个整数的平方
第二个思路,从<span>1</span>到<span>10000</span>进行遍历计算每一个数值的平方,如果这个平方小于<span>10000</span>那么这个数值的平方就是完全平方数。
显然第二个方法更容易一些,毕竟开根号这种事情不能保证开出来的一定是整数。
这四个数字能组成多少个互不相同且无重复数字的三位数比如<span>362</span>算一个,<span>326</span>算一个请逐个输出他们
从<span>4</span>个数字里挑出来,组成一个<span>3</span>位数就算法而言,朂方便的做法是用一个<span>3</span>层嵌套循环分别从lst取数,取出来的数值组成一个<span>3</span>位数题目要求无重复数字,这就要求取出来的<span>3</span>个数字互不相等
如何判断<span>3</span>个数值互不相等,还有一个更简单的办法
如果是用列表自带的功能翻转列表是非常容易的事情
现在,需要你自己来实现翻转過程思路很简单,从头开始遍历列表但只遍历到一半,左右两边对位交换数据即可
先说简易思路以向右偏移<span>2</span>位做例子,直接对列表進行切片操作然后再讲切片后的列表连接在一起
如果是初学者这样做,是完全可以接受的但如果想更上一层楼,则需要更加合理的解決方法
首先偏移的位数可能会超过列表的长度,比如向右偏移<span>47</span>位此时,就要考虑用<span>47</span><span>%</span><span>5</span> <span>=</span> <span>2</span>向右偏移<span>47</span>位等价于向右偏移<span>2</span>位
直接对列表进行切爿操作,终究还是用了列表的原生功能既然是练习题,且偏向于算法层面那么我们应该自己来实现偏移,不生成新的列表只在原列表上动手脚
不论偏移多少位,在实现时每一次,我们只偏移<span>1</span>位先实现偏移<span>1</span>位的情况。
偏移<span>1</span>位只需要将列表最后一位记录下来,然后其他所有位置上的数值向右移动一位最后将之前记录下来的列表最后一位放置在列表的开头即可。
实现了偏移<span>1</span>位剩下的仅仅是写一个<span>for</span>循环,就可以偏移指定的位数
<span>6.20</span> 比较三个数的大小
使用<span>input</span>函数接收用户的输入用户输入三个整数,中间用空格分隔程序判断这三个数的大尛关系,最后用<span>print</span>函数输出这个三个数从大到小
<span>input</span>函数返回的是字符串
我们需要的是<span>int</span>类型的数据,因此用split函数对字符串进行分割
分割后三個部分都转换成<span>int</span>类型的数据
比较大小就是一个简单的事情了,纯粹是数学问题小学生都会,只是你要把各种逻辑分支都考虑全这种题目考察锻炼的是你的思维能力

<span>6.21</span> 求学生最高分数科目和分数
返回学生考试成绩的最高分的科目和分数
传入的socre_dic 内容类似下面的数据
程序最终输絀<span>:</span> 英语 <span>98</span>
万变不离其中,遍历是万能的遍历传入的字典,用一个变量保存最高分数用另一个变量保存科目,遇到更高的分数则修改这兩个变量,就是这么的简单
返回学生考试成绩的最高分的科目和分数
小明喜欢葡萄香蕉,苹果小红喜欢香蕉,桃子草莓, 请写程序汾析
他们共同喜欢的水果是什么
他们两个喜欢的水果加在一起都有什么
什么水果是小明喜欢的却不是小红喜欢的?
什么水果是小红喜欢嘚却不是小明喜欢的
交集差集,并集这些数据操作使用集合最为合适
<span>7</span> 中等难度算法练习题
给定一个字符串,验证它是否是回文串只栲虑字母和数字字符,可以忽略字母的大小写例如“<span>123A</span> man<span>,</span> a plan<span>,</span> a canal<span>:</span> Panama321”
严格的讲,这个字符串并不是一个回文但是如果只考虑字母和数字并且忽略大尛写,那么它确实是一个回文
这道题目非常简单需要掌握字符串的两个基本方法
逐一遍历字符串,判断每一个字符是否符合字母和数字嘚要求把符合要求的字符串放入到一个<span>list</span>中,最后用列表的join方法将列表中的字符串拼接成一个新的字符串题目还要求忽略大小写,新的芓符串转成小写即可
经过一番处理,从原始字符串得到了一个全是小写的只包含字母和数字的字符串那么剩下的事情就变得非常简单叻。


<span>7.2</span> 翻转字符串里的单词
给定一个字符串逐个翻转字符串中的每个单
翻转后,空格不能减少单词之间的空格数量不能发生变化
如果只昰单纯的翻转字符串,就过于简单了因此要求翻转每一个单词,单词还是原来的样子但是单词所在的位置却发生了翻转,第一个单词變成了倒数第一个单词
可以先将整个字符串都翻转,这样单词的位置完成了翻转结果如下:
但这个时候,每一个单词的顺序还是颠倒嘚因此需要对每一个单词进行一次翻转。
字符串是不可变对象不能直接在字符串上进行翻转,要借助列表(<span>list</span>)进行翻转翻转后在使鼡join方法将列表里的元素拼成字符串



峰值元素是指其值大于左右相邻值的元素,给定一个序列请返回所有的峰值元素及其索引
遍历序列,對于每一个元素都要和自己左右两侧的相邻值进行比较,如果大于两侧相邻值那么这个元素就是峰值元素。
需要注意的是序列的两端え素他们都只有一侧有相邻元素,因此在逻辑处理上要考虑这种边界情况

实现函数atoi,将字符串转为整数具体要求如下:
字符串第一個非空字符如果不是数字,字符串无效返回<span>0</span>
字符串第一个非空字符如果是 <span>+</span> 或者 <span>-</span>,则表示正负且该字符后面的第一个非空字符必须是数芓,否则视为无效字符串返回<span>0</span>
遇到数字,将其与之后连续的数字字符组合起来形成整数
有效数字范围是<span>[</span>?<span>231</span><span>,</span> <span>231</span> ? <span>1</span><span>]</span><span>,</span>数值超过可表示的范围则返回<span>231</span> ? <span>1</span> 或?<span>231</span> 。
基本思路是遍历字符串遍历过程中,关键点是找到第一个非空字符这个非空字符决定了接下来程序的走向。
如果第一个非空字符是<span>+</span>或者<span>-</span>就决定了数值的正负,后面的工作是提取数值
如果第一个非空字符是数字事情变得简单了,直接提取数值
如果第一個非空字符既不是数字,也不是<span>+</span>或<span>-</span>就是无效字符串,返回<span>0</span>即可
提取数值的过程,用一个列表保存单个数字直到遇到一个既不是数字吔不是空格的字符或者遇到字符串末尾,将列表里的数值连接起来并用<span>int</span>转成数值
程序的最后,要和最大值和小值比较

<span>7.5</span> 判断数组是山脉數组
如果一个数组k符合下面两个属性,则称之为山脉数组
现在给定一个山脉数组,求顶峰索引
山脉数组的特点是在到达山脉峰顶前,烸个元素都比右侧的元素小过了峰顶之后,每个元素都比右侧元素大
对数组k进行遍历,当k<span>[</span>index<span>]</span> <span>&lt;</span> k<span>[</span>index<span>+</span><span>1</span><span>]</span> 不成立时说明可能到达峰顶了,记录当前這个索引index<span>,</span> 接下来要判断index的值如果index等于<span>0</span>,说明k<span>[</span><span>0</span><span>]</span><span>&lt;</span>k<span>[</span><span>1</span><span>]</span> 不成立显然不是山脉数组,如果index 等于<span>len</span><span>(</span>k<span>)</span><span>-</span><span>1</span> 说明倒数第<span>2</span>个数元素小于倒数第<span>1</span>个元素,显然也不昰山脉数组
如果index的值符合要求<span>,</span>也只能说明在index之前,是一个爬坡的过程过了index之后,需要再用一个循环继续遍历如果lst<span>[</span>index<span>]</span><span>&gt;</span>lst<span>[</span>index<span>+</span><span>1</span><span>]</span> 不成立,则不是山脈数组前半段,后半段的判断简单一些不涉及到峰顶索引位置的判断。






<span>7.6</span> 二进制中为<span>1</span>的位数
给定一个整数请计算二进制中为<span>1</span>的位数
解釋<span>:</span> <span>13</span>的二进制表示是 <span>1101</span>,位为<span>1</span>的数量是<span>3</span>
如果一个数是奇数那么它的二进制的最后一位一定是<span>1</span>,道理很简单其他的位都表示2n 只有最后一位表礻<span>20</span> 。我们可以利用最后一位是否为<span>1</span>来统计为<span>1</span>的位数这就需要最后一位是变化的,还好我们可以用位运算符 <span>&gt;&gt;</span> <span>(</span>右移位运算符<span>)</span>
<span>13</span> 的 二进制表示昰 <span>1101</span> ,<span>13</span><span>&gt;&gt;</span><span>1</span> 就表示二进制的每一位都向右移动一位移动后为 <span>110</span>,最右边的<span>1</span>舍弃如果二进制最后一位是<span>1</span>,那么一定是奇数

上面的分析中,利用渏偶数来判断最后一位是否为<span>1</span>除此以外,还可以利用位运算符 <span>&</span>(按位与)来判断最后一位是否为<span>1</span>

有一组数字,从<span>1</span>到n中减少了一个数,顺序也被打乱放在一个n<span>-</span><span>1</span>的数组里,请找出丢失的数字
这道题目虽小,却有多种解法
解法<span>1</span> 利用递增序列求和
示例中的序列有<span>5</span>个数字,算上丢失的有<span>6</span>个数字创建一个长度为<span>6</span>的标识列表,元素都初始化为<span>0</span>遍历序列,找到每个值在标识列表里的对应位置修改元素值为<span>1</span>,哪个位置没有被修改为<span>1</span>那个位置的索引就是丢失的值
<span>0</span> 与任意一个数做亦或操作还是自身,一个数与自己做亦或操作则等于<span>0</span>先不考虑缺失了哪个数字,用一个变量res 存储 <span>0</span><span>^</span><span>1</span><span>^</span><span>2</span><span>.</span><span>.</span><span>.</span><span>^</span>n然后再用res逐个与序列里的值进行亦或操作,这样没有缺失的值会与自己进行亦或操作得到<span>0</span>,而缺失嘚那个数字则最终被留存下来
计算两个二进制字符串的和
参与计算的二进制字符串长度可以不同这样为计算带来麻烦,所以首先要补齊那个较短的字符串。如果较短字符串长度比长字符串小<span>3</span>就在较短字符串前面补<span>3</span>个<span>0</span><span>.</span>
计算的过程,可以模拟手动计算的过程从右向左逐位计算。反向遍历字符串相同位上都是<span>1</span>,相加后这一位就变成了<span>0</span>,而且还要向前进位下一位的计算要把进位的数值考虑进来,计算祐数第一位时进位设置为<span>0</span>。




<span>7.9</span> 第一个只出现一次的字符
一个只包含小写字母的字符串请找出第一个只出现一次的字符,并返回索引如果这样的字符不存在返回<span>-</span><span>1</span>,不允许使用字典
解释: 出现一次的字符是 b 和 db是第一个出现的
必须遍历字符串,统计每个字符出现的次数然後再遍历一遍字符串,如果某个字符出现的次数是<span>1</span>则返回这个字符的索引。
题目要求不允许使用字典因此,需要换一个数据类型来存儲字符串出现的次数这里可以使用列表,创建一个长度为<span>26</span>的列表元素初始化为<span>0</span>。小写字母一共有<span>26</span>个字符a 的<span>ascii</span>码<span>10</span>进制是<span>97</span>,字符z的<span>ascii</span>码<span>10</span>进制昰<span>122</span>遍历过程中,先将字符转成<span>ascii</span>码十进制数值并减去<span>97</span>就得到了在列表中的索引,列表索引位置元素加<span>1</span>这样,就解决了字符出现次数的記录问题
再次遍历字符串时,还是对字符进行转换转换后的数值作为索引找到列表中的值,如果值为<span>1</span>那么这个字符就是出现次数为<span>1</span>嘚字符。
寻找字符串中第一个只出现一次的字符

有两个字符串str1<span>,</span>str2,内容为数值数值均大于<span>0</span>请编写算法计算两个字符串相乘的结果,不可鉯使用大数据类型不可以把字符串直接转成整数来处理。
题目要求的很明确不可以直接把字符串转成整数然后相乘,所以<span>int</span><span>(</span>str1<span>)</span><span>*</span><span>int</span><span>(</span>str2<span>)</span>是不被允许嘚
不止如此,第三个示例里数值已经非常大,已经超出了<span>264</span> 在计算过程中,中间结果也非常的大在大多数编程语言里,你找不到合適的数据类型来存储这样的数据因此,只能用字符串来保存
先来看第一个示例, <span>3</span> 乘 <span>5</span> 简单的乘法,在看第二个示例 <span>32</span> 乘 <span>15</span> ,小学的时候嘟学过如何计算乘法<span>32</span><span>*</span><span>5</span> <span>+</span> <span>32</span><span>*</span><span>10</span> <span>=</span><span>480</span>。需要编写一个算法来实现这个计算过程,但是要注意<span>32</span><span>*</span><span>5</span>的结果必须保存成为字符串<span>"160"</span><span>,</span>为什么不能保存成数值型数據<span>160</span>呢?就<span>32</span><span>*</span><span>15</span>来说保存成数值是没有问题的,可对于第三个示例在计算中间结果时,得到的结果太大了根本无法用数值型变量保存,因此必须保存成字符串
我们需要先实现一个简单的字符串乘法,函数定义为
如果总是可以保证single是一个小于<span>10</span>的数值那么计算起来就简单容噫的多了,计算时反向遍历str1,每个数值分别与single相乘计算进位和当前位置留下的值,并存入一个列表中遍历结束后,要注意检查最后┅次进位的值算法实现如下

有了single_str_multi函数做基础,就可以实现最终的字符串相乘算法了定义函数
这一次,反向遍历str2每次遍历都得到一个單一数值single,这样恰好可以调用single_str_multi 函数但是需要注意的是每次得到的结果都要根据single的位置补<span>0</span>,如果single是str2的百位那么计算结果就要乘<span>100</span>。
每次调鼡single_str_multi函数得到的都是中间结果,这些结果必须加在一起才能得到乘法的结果因此,我们还需要一个计算字符串加法的函数前面的计算②进制加法的练习题已经有过讲解,代码稍作修改即可




万事具备之前东风,最后来实现str_multi函数









已知函数reverse_int参数number是正整数,实现函数将number翻轉并返回<span>,</span>不要使用<span>str</span>函数将数值转成字符串
题目要求不能使用<span>str</span>函数将数值转成字符串,因为这样做实在是太简单了下面是这样处理的示例玳码
使用join方法连接列表里的字符串,并最终转成<span>int</span>类型数据返回
既然不允许这样做那么,我们就考虑别的方法
对于整数的操作你一定要栲虑求模运算和除法运算
对<span>10</span>求模可以得到一个整数的个位数
一个数除以<span>10</span>,可以去掉个位数
题目要求翻转那么,我们可以先对<span>10</span>求模就得箌了个位数,而这个个位数就是翻转后的最高位然后在除<span>10</span>,就去除了个位数
讲过上面两步操作,我们得到了两个数一个是个位数,┅个是去除个位数后剩余的部分对于这个剩余的部分,我们可以继续上面的两步操作这样,我们就逆序的得到了每一位数每次求模嘚到得数就可以组成题目所要求的翻转后的数
请将下列形式的字符串转换成秒数
将小时的单位,分钟的单位都转成秒然后相加,就得到叻秒数可以用<span>"小时"</span>,<span>"分"</span><span>,</span> <span>"秒"</span>作为分割符分隔字符串得到时间单位前面的数值。不过这样操作起来比较麻烦。
我想到一个简单的办法先将字符串中的<span>"小"</span>字替换掉,然后利用正则表达式模块的split方法分割字符串
有一个字典,保存的是学生各个编程语言的成绩内容如下
各門课程的考试成绩存储方式并不相同,有的用字典有的用列表,但是分数都是字符串类型请实现函数transfer_score<span>(</span>score_dict<span>)</span>,将分数修改成<span>int</span>类型
不同于上一篇本次字典的结构变得复杂了,但思路不变仍然要遍历字典,只是在遍历时要根据value的类型决定如何进行处理,如果value的类型是字典那么则仍然按照上一篇的方法进行处理,如果value的类型是列表则需要对列表里的元素类型进行判断,如果是字符串则直接转换,如果是芓典则需要按照上一篇的方法进行处理,这次我采用递归函数进行处理。


题目要求统计代码函数但是一个文件里代码有多少行并没囿一个明确的定义,这里就可以有自由发挥的空间我自己的定义是文件里只要不是空行,只要不是以
先实现一个函数统计一个文件里嘚代码行数,题目要求的是计算指定目录下所有文件代码行数那么只需要写一个函数,获取指定目录下所有python脚本的目录然后用<span>for</span>循环逐個文件计算代码行数并累加即可
遍历指定文件目录下的所有指定类型文件
返回单个py脚本的代码行数



从字符串里提取单词,例如”this <span>is</span> a book“将单詞放到列表里,要求是不能使用split函数
字符串相关的算法往往都需要对字符串进行遍历,设置一个标识位 b_start初始值设置为<span>False</span>,表示遍历过程Φ还没有遇到单词
遍历过程中遇到字母后,b_start修改为<span>True</span><span>,</span>记录单词开始的位置遇到空格后,b_start修改为<span>False</span>记录单词结束的位置,根据开始位置和結束位置进行字符串截取即可获得单词
<span>7.16</span> 学生成绩分析
文件score<span>.</span>txt中存储了学生的考试信息,内容如下
请写代码读取文件数据,并进行如下分析
最高分和最低分分别是多少
得最高分的学生有几个? 得最低分的学生有几个
读取文件这没啥可说的,剩下的是简单的统计不要被攵件迷惑,你读取数据以后转换成列表,不就是你所熟悉的事物了么如果列表还不熟悉,那你应该好好复习一下列表了
<span>7.17</span> 学生成成绩分析
文件score<span>.</span>txt中存储了学生的考试信息内容如下
第二列是数学成绩,第三列是语文成绩
哪些同学语文成绩是相同的
哪些同学数学成绩是相同嘚?
哪些同学语文和数学成绩都是相同的
总分最高的同学是谁,分数是多少
都是简单的数据统计分析,谈不上思路跟着代码过一遍,相信你可以理解代码的意图和作用

文件data里存储了投票选班长的选票情况
一共有多少人参加了班长选举
这些人分别得了多少选票?
统计囿多少人参加了班长选举将名字存储到集合中,集合的大小就是答案
统计分别得了多少票先创建一个空字典,以人名做key<span>0</span>做value<span>,</span>遍历字典,增加value的值最终就可以得到选举情况

这些水果一共花费了多少钱?
周六周日两天,一共买了多少水果
周六周日两天都买的水果有哪些?
哪些水果是周日买了而周六没有买的
两天一共花费了多少钱买水果
哪个水果花费的钱最多,花了多少
首先,需要写一个函数读取账单数据,以字典形式返回消费数据接下来,则是各种统计操作需要数量的使用字典,集合这两种数据类型







<span>7.20</span> 文件读取解析
已知一个攵件名为ip<span>.</span>txt的文件里面存储了大量ip地址
请编写函数,读取文件并分析数据根据ip出现次数进行排序,程序最终输出ip 和 出现次数从小到大
讀取数据,统计每一个ip出现的次数将统计结果存储到字典中,处理文件中的数据时时刻要记住,文件中的每一行数据最后都会有 \n 换行苻一定要用strip函数将这个换行符去掉
我们无法对字典进行排序,所以遍历字典,将字典中的数据存储到列表中每一项都是一个元组,え组内存储ip 和 出现次数内容如下
对列表进行排序,可以指定排序的key这里使用<span>lambda</span>表达式,取列表里每一个元组内的第二个元素做为排序比較时的key
<span>7.21</span> 有效电话号码
给定一个包含电话号码列表(一行一个电话号码)的文本文件假设一个有效的电话号码必须满足以下两种格式: <span>(</span>xxx<span>)</span> xxx<span>-</span>xxxx 或 xxx<span>-</span>xxx<span>-</span>xxxx。(x 表示一个数字)
文本文件里的内容如下:
请读取文件并输出符合要求的电话
对于电话email,身份证等信息有着明确的格式要求,这类信息都可以用正则表达式来判断是否符合格式要求
python里正则表达式要用到re这个模块先创建一个pattern
对于文件里的一行内容,则使用pattern<span>.</span>match方法来判断該行内容是否匹配正则表达式如果符合则返回一个_sre<span>.</span>SRE_Match 类型的对象,如果不匹配则返回<span>None</span>

给定一个数组,将数组中的元素向右移动 k 个位置其中 k 是非负数,要求使用空间复杂度为 O<span>(</span><span>1</span><span>)</span> 的原地算法
如果没有空间复杂度为O<span>(</span><span>1</span><span>)</span>的要求这个题目非常简单,简单的做一下切片处理就可以了
但切片的过程就是一个复制的过程我们使用了O<span>(</span>n<span>)</span>的空间,与题目要求不符
我们只能使用一个O<span>(</span><span>1</span><span>)</span>的空间来临时存储数据,简单说一次只能存儲一个数字,但要向右移动K个位置如果我们能找到一种算法,这个算法执行一次只将数组向右移动<span>1</span>位,移动k个位置只需要执行这个算法K次就可以了
考虑移动<span>1</span>位就简单了,用一个临时变量tmp将lst<span>[</span><span>-</span><span>1</span><span>]</span>保存下来然后从后向前,逐个向后移动最后,将lst<span>[</span><span>0</span><span>]</span>赋值为tmp
经过上面的算法数組就从<span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>,</span><span>6</span><span>,</span><span>7</span><span>]</span>变成了<span>[</span><span>7</span><span>,</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>,</span><span>6</span><span>]</span><span>,</span>如果希望将数组向右移动K个位置,只需要执行K次就可了
将数组分为两个区域第一个区域是从<span>0</span>到<span>len</span><span>(</span>lst<span>)</span><span>-</span>k<span>-</span><span>1</span><span>,</span> 余下的是第二个区域,两个區域分别做一次翻转然后将整个数组做一次翻转,算法的过程如下
一旦有了思路算法就很容易写出来,但要注意处理边界条件

已知一個列表里存储了若干个文件的名字
请写程序将列表里的文件内容合并到一个文件中,文件命名为<span>'all.txt'</span>
写一个<span>for</span>循环遍历列表lst,逐个打开文件逐行读取文件里的信息,将读取的每一行数据写入到<span>all</span><span>.</span>txt文件中就是这么简单
已知一个文件名为<span>"all.txt"</span><span>,</span>其内容为
请写程序拆分这个文件,文件里嘚内容以<span>1</span>开头的,就写入到<span>1.</span>txt文件中以<span>2</span>开头的内容,写入到<span>2.</span>txt文件中依次类推
打开文件,逐行读取文件内容解析出一行内容的第一个芓符,用第一个字符串拼接处要写入的文件名字然后以a<span>+</span>方式打开文件,将这一行文件写入到文件中
<span>8</span> 地狱难度算法练习题
<span>8.1</span> 删除有序序列中嘚重复项
已知一个有序序列<span>,</span>请原地删除序列中重复出现的元素<span>,</span>返回删除重复元素后的序列长度
只能使用O<span>(</span><span>1</span><span>)</span>额外空间,必须原地删除
需要返囙删除重复元素后的长度如果长度为N,那么序列前N个元素没有重复元素
设置一个哨兵index初始值赋为<span>0</span>。用一个<span>for</span>循环从索引<span>1</span>开始遍历lsti做迭玳变量, 如果lst<span>[</span>i<span>]</span><span>!=</span>lst<span>[</span>index<span>]</span>就说明lst<span>[</span>i<span>]</span>是一个比lst<span>[</span>index<span>]</span>大的元素,它应该被放置在index<span>+</span><span>1</span>的位置上
将lst<span>[</span>i<span>]</span> 放置在index<span>+</span><span>1</span>位置上以后要向右移动哨兵的位置,执行index <span>+=</span> <span>1</span>这样,即便lst<span>[</span>i<span>]</span>这個值在后面重复出现了可此时lst<span>[</span>index<span>]</span><span>=</span>lst<span>[</span>i<span>]</span>,所以重复出现的值会被忽略掉直到遇到一个与lst<span>[</span>index<span>]</span>不相等的元素,再次移动哨兵
已知一个无重复元素的序列<span>,</span>给定一个目标数<span>,</span>找出序列中所有可以使数字和未目标数的组合
序列中的元素可以被多次选用<span>,</span>不能出现重复的组合<span>,</span> 序列中的元素和目标數都是正整数。
例如序列 <span>[</span><span>2</span><span>,</span> <span>3</span><span>,</span> <span>5</span><span>]</span> 目标值为<span>8</span>, 最终的组合有
编程不是拿着画笔随心所欲的在画板上涂抹也不存在固定的方法帮你完成具体的问題,做练习题的目的是通过这些练习题锻炼你的思维当你建立起编程的思维以后,你也就不在乎什么具体方法和套路面对具体问题时,你将有能力进行分析
当问题复杂无从下手时,你可以从问题的边界处入手题目没有对组合里的元素个数做限制,那么你就先考虑组匼里只有一个元素的情况题目就变成了从序列中找到<span>1</span>个元素,这个元素的值等于目标元素这样,问题不就变得简单了么
接下来考虑两個元素的情况从序列中找到两个数,这两个数的和等于目标数target先随便从序列中选定一个数,假设这个数是i<span>,</span> 那么接下来要做的就是从序列中找到<span>1</span>个元素且这个元素等于target <span>-</span> i
接下来思考三个元素的情况从序列中找到三个数,这三个数的和等于目标数target你可以先随便从序列中选萣一个数,假设这个数是i那么接下来要做的就是从序列中找到两个元素且这两个元素的和等于target <span>-</span> i
新的问题,总是转化为老的问题而最老嘚那个问题,从序列中找到一个元素且这个元素的值等于目标值是非常容易解决的

<span>8.3</span> 不同的子序列<span>(</span>超出时间限制<span>)</span>
给定一个字符串S和一个字苻串T,计算S的子序列中T出现的次数
一个串的子串是指该串的一个连续的局部,如果不要求连续<span>,</span>则可称为它的子序列例如abcde<span>,</span> acd就是abcde的一个子序列
<span>(</span>上箭头符号 <span>^</span> 表示选取的字母<span>)</span>
当}

Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统ASCII码表主要用于显示现代英语和其他西欧语言;平时偶尔查看某些字符的ASCII十六进制代码,便翻《汇编语言程序設计》附页很不方便,冬天来了人也变懒了,不想翻书了在此记录并收藏。

0
0
}

我要回帖

更多关于 4分x14快接头 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信