初级编程通关练习题 #13 – 匿名函数搜索字符串

给定两个字符串列表 arr1 和 arr2,检查列表 arr1 里面的每一个字符串是否包含在列表 arr2里面的字符串中。实现一个函数以 arr1 和 arr2 为参数,返回arr1的字符串可以在 arr2找到的列表,如果都找不到就返回空列表。 编码要求:使用lambda 匿名函数单行完成上面的搜索,并返回结果。全部代码长度不能超过65个字符。 输入样例: arr1 = ["load", "day", "sun", "gone"]arr2 = ["secret", "keep loading", "harvest", "sunshine", "holiday"] 输出样例: ['day',…

高级编程通关练习题 #2:解析数学表达式

以字符串形式给定一条有效的数学表达式,使用字符串解析的方式计算该表达式的结果。注意不能使用 eval 方法来得出结果。 表达式的规则如下: 表达式里可能出现的数学操作符为:加(+)、减(-)、乘(*)、除(/)可能的数值包括正负数和小数需要分析可能出现的多重小括号,譬如:(15 * (9.5 + 6)- -10)/ 4 输入样例: "(-7 * -(16 / 4)) * (9.5 - 4.5)" 输出样例: 140.0 算法思路: 方法一:可以采用数据结构stack来逐一处理每个字符如果字符是数字或小数点,则添加到到临时字符串变量A中。如果字符不是数字或者小数点,则把临时变量A中的字符串转换成数字,然后压栈。如果是字符是数学操作符加减乘除或左小括号,就把该字符压栈。如果字符是右小括号,那么需要从栈顶弹出数值和操作符保存到临时变量B,直到遇到左小括号为止,然后将字符串B做数学计算。数学计算的顺序如下:先计算除法,然后计算乘法,接下来计算减法,最后计算加法。字符串循环读取完毕后,检查stack栈内是否为空,如果不为空则需要将栈内内容重复上面第三项操作。方法二:使用正则表达式来解析字符串以左右小括号为标志先后解析需要计算的表达式提取数学操作符和数值后做相应处理

中级编程通关练习题 #4 – 字符串排列寻址

给定一个全部是大写字母的字符串,计算在该字符串的所有字母所组成的全部排列序列中,当前字符串按照字母顺序所处的位置。譬如:字符串 CODE 四个字母总共可能的排列总数为 4!= 24,按照字母顺序来计算,CODE位于第五位,在CODE之前的四个排列分别是:CDEO,CDOE,CEDO 和 CEOD。 最简单的计算方法是使用函数 permutations来把当前字符串所有可能的排列都找出来,然后寻址就可以得到结果,下面是代码样例: 上面这个方法的缺陷是效率低下,如果字符串的长度超过15个就会非常耗时,如果长度达到25个基本上电脑就要宕机。主要原因是函数permutations在搜索大量排列的场景下极其耗时,字符串长度增加一个,相对应的运算时间呈指数级增长。 所以我们需要采用其他方法来为字符串的排列寻址,要求是字符串长度在25位以内时,寻址的时间不能超过0.5秒。 输入样例: word = 'CODEGURUACADEMY' 输出样例: 9066420841 算法思路: 方法一:循环字符串正推 - 上面的输入样例字符串分拆然后按照字母排序后的列表是:['A', 'A', 'C', 'C', 'D', 'D', 'E', 'E', 'G', 'M',…

入门级编程通关练习题 #17 – 字符串操作

给定一个字符串,根据下面的规则创建一个新的字符串:如果该字符串的结尾是数字,则把当前数字加一;如果结尾不是数字,那么把数字1添加到结尾。 输入样例: codeguru099 输出样例: codeguru100 算法思路: 方法一:可以借助正则表达式(regular expression)来匹配字符串结尾的数字,然后做修改。方法二:可以使用字符串函数 str.rstrip()来把结尾的数字剥离,然后做处理。

初级编程通关练习题 #5 – 文本对齐

给定一个字符串和一个单行长度N(20 < N < 80),按照下面的规则来把字符串做自动换行和文本对齐。 每一行的头尾都需要是以单词开始和结束,也就是头尾对齐。单词之间使用空格来分隔。在不切割单词的情况下,每一行需要容纳尽可能多的单词。每一行使用换行符 '\n' 来表示该行结束,该换行符不算入每一行的长度。单词之间的空格数量差异不能大于1,也就是空格需要尽量平均分配。空格多的分隔需要放在前面,少的放在后面。譬如:”a---b---c--d--e\n“,'-'表示空格。最后一行不需要调整空格的数量,每个单词之间只需要一个空格。同时也不需要换行符'\n'。如果单行是一个单词则不需要空格。 下面的图案是一段文字按照每行30个字符来进行文本对齐后的结果: 输入样例: data = 'ABC EFG HI J', width = 8 输出样例: 'ABC EFG\nHI J' 算法思路: 方法一:使用递归算法,每次通过搜索空格来取单行最大数字符串来进行排版,一直到最后一行。方法二:使用for循环,每次也是取一行来做排版。单行排版时需要计算空格如何均匀分配,可以采用字符串函数 replace 来进行。

初级编程通关练习题 #4 – 寻找缺失数字

按照下面的格式给定一个仅包括加法符 +、减法符 - 和乘法符 * 的数学公式字符串: [数字] [操作符] [数字] = [数字] 算式中包括若干个问号?都代表同样的单个数字(0-9),而且该数字和算式中其他数字不重复。如果问号位于一个数字的首位,该问号不能为0。请找出符合要求的最小数字。譬如:"?*11=??",该问号是 2, 数字1已经存在,所以数字2是符合要求的最小值:2 * 11 = 22。 输入样例: "??*??=435?" 输出样例: 6 66 * 66 = 4356,所以问号代表的数字是 6。 算法思路: 要点:比较字符串算式是否成立,可以使用函数…

初级编程通关练习题 #2 – 时间格式

给定一个整数N代表秒数,把它按照下面的规则转换成时间字符串:如果秒数为零,则返回字符串"now"。如果秒数大于零,则返回用年、日、时、分、秒表达的时间字符串,中间用逗号分隔,最后两个时间段用 and 连接。譬如秒数 123456需要转换为:1 day, 10 hours, 17 minutes and 36 seconds。 输入样例: 987654321 输出样例: 31 years, 116 days, 4 hours, 25 minutes and 21 seconds 算法思路: 首先用每年的总秒数整除输入数值得到年数,然后用同样的总秒数mod输入数值得到剩余秒数。然后用每天的总秒数整除剩余秒数得到天数,再用这个总秒数mod剩余秒数得到下一步的剩余秒数。接着用同样的逻辑操作剩余秒数得到小时数、分钟数,最后剩下的就是秒数。根据上面计算出来的年数、天数、小时数、分钟数和秒数来格式化一个时间字符串并返回。

入门级编程通关练习题 #16 – 修改字符串

给定一个字符串,把里面的每个单词首字母放到单词最后,然后加上"cga",如果是标点符号则保持不变。 输入样例: msg = "It is important to learn algorithm !" 输出样例: "tIcga sicga mportanticga otcga earnlcga lgorithmacga !" 算法思路: 检查一个单词是否有标点符号,可以用函数 str.isalnum() 或者函数 str.isalpha()。

入门级编程通关练习题 #15 – 地名格式化

给定一组地名的字典列表,创建一个地名字符串,每个地名之间用逗号隔开,最后两个地名用&符合隔开。 输入样例: arr = [{'city': 'Folsom'}, {'city': 'Bend'}, {'city': 'Seaside'}] 输出样例: "Folsom, Bend & Seaside" 算法思路: 使用 str.join() 函数配合列表推导式来创建字符串,最后一个&符号需要做特别处理。

入门级编程通关练习题 #12 – 字符积分

给定一给字符串里面包含一组全部小写的词汇,按照下面的规则计算每个词汇的积分:字母 a 为1分, 字母 b 为2分, 字母 c 为3分...,以此类推,返回得分最高的词汇。如果两个词汇得分相同,返回位置靠前的词汇。 输入样例: "seattle is a great place to visit during the summer time." 输出样例: "summer" 算法思路: 可以使用 max 函数的如下格式:max(iterable[, default=obj, key=func]) ->…