Python 作业答疑_6.15~6.18
一、Python 一班
1. 比较字符串
1.1 问题描述
比较两个字符串A
和B
,字符串A
和B
中的字符都是大写字母,确定A
中是否包含B
中所有的字符。
1.2 问题示例
例如,给出A="ABCD"
,B="ACD"
,返回True
;给出A="ABCD"
,B="AABC"
,返回False
。
1.3 问题提示
先统计字符串A
中的字符以及字符的个数。再从B
中查找字符,如果出现A
中对应字符为 0
,则可认为A
中不包含B
字符串。不能使用循环嵌套。
1.4 编码实现
a = "ABCD"
b = "ACD"
table = [0 for _ in range(26)]
res = True
for c in a:
if table[ord(c) - 65] == 0:
table[ord(c) - 65] = 1
else:
table[ord(c) - 65] += 1
for c in b:
if table[ord(c) - 65] == 0:
res = False
else:
table[ord(c) - 65] -= 1
print(res)
2. 能否转换
2.1 问题描述
给两个字符串S
和T
,判断S
能不能通过删除一些字母(包括0
个)变成T
。
2.2 问题示例
输入为S="longterm"
和T="long"
,输出为True
。
2.3 问题提示
要求不能使用循环嵌套;不能使用字符串相应的查找方法。只能使用基础语法自行设计算法实现。
时间复杂度要控制在 O(n)
,本题和上题的是不相同的,请注意审题。T
是 S
的一个子字符串。
2.4 编码实现
s = "longterm"
t = "long"
res = False
j = 0
for i in range(len(s)):
if s[i] == t[j]:
j += 1
if j == len(t)-1:
res = True
break
print(res)
3. 抽搐词
3.1 问题描述
正常单词不会有连续2
个以上相同的字母,如果出现连续3
个以上的字母,那么这是一个抽搐词。给出该单词,从左至右求出所有抽搐字母的起始点和结束点。
3.2 问题示例
输入str="whaaaaatttsup"
,输出为[[2,6],[7,9]]
,"aaaa"
和"ttt"
是抽搐字母;
输入str="whooooisssbesssst"
,输出为[[2,5],[7,9],[12,15]]
,"ooo""sss""ssss"
都是抽搐字母。
3.3 问题提示
在迭代字符串之前,声明一个临时变量,刚开始初始化为空字符串,如 oldc=''
,用来保存当前迭代字符的前一个字符。
3.4 编码实现
str = "whaaaaatttsup"
oldc = ""
res = []
count = 0
start = 0
for i in range(len(str)):
if str[i] == oldc:
count += 1
else:
res.append([start, start + count])
count = 0
start = i
oldc = str[i]
print(res)
for i in res:
if i[len(i) - 1] - i[0] >= 2:
print(i)
二、Python 二班
1. 字符串写入的行数
1.1 问题描述
把字符串S
中的字符从左到右写入行中,每行最大宽度为100
,如果往后新写一个字符导致该行宽度超过100
,则写入下一行。
其中,一个字符的宽度由一个给定数组widths
决定,widths[0]
是字符a
的宽度,widths[1]
是字符b
的宽度,…,widths[25]
是字符z
的宽度。
把字符串S
全部写完,至少需要多少行?最后一行用去的宽度是多少?将结果作为整数列表返回。
1.2 问题示例
输入:
widths=[10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S="abcdefghijklmnopqrstuvwxyz"
输出:[3,60]
每个字符的宽度都是10
,为了把这26
个字符都写进去,需要两个整行和一个长度60
的行。
1.3 问题提示
迭代字符串,获取每一个字符的宽度。使用 ord('字符')-97
可以获取字符在 widths
数组中的位置。 97
是小字字母的ASCII
编码。ord(‘字符’)
可以获取到每一个字符的编码。
1.4 编码实现
widths = [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
s = "abcdefghijklmnopqrstuvwxyz"
# 记录最终的行数
line = 0
# 宽度
width = 0
# 迭代字符串
for w in s:
# 查找字符的宽度
width += widths[ord(w) - 97]
if width == 100:
line += 1
width = 0
if width >= 0:
line += 1
print([line, width])
2. 独特的莫尔斯码
2.1 问题描述
莫尔斯码定义了一种标准编码,把每个字母映射到一系列点和短划线,例如:a->.-
,b->-...
,c->-.-.
。给出26
个字母的完整编码表格:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
。
给定一个单词列表,单词中每个字母可以写成莫尔斯码。例如,将cab
写成-.-.-....-
,(把c
,a
,b
的莫尔斯码串接起来),即为一个词的转换。
返回所有单词中不同变换的数量。
2.2 问题示例
例如,输入words=["gin","zen","gig","msg"]
,输出2
,每一个单词的变换是:
"gin"->"--...-."
``“zen”->“–…-.”`
"gig"->"--...--."
"msg"->"--...--."
也就是有两种不同的变换结果:"--...-."
和"--...--."
。
2.3 问题提示
使用 ord()
函数获取字母在数组中的位置,再获取字母对应的编码。
2.4 编码实现
words = ["gin", "zen", "gig", "msg"]
# 莫尔斯码
mrsm = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.",
"--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."]
res = []
for w in words:
ms = ""
for c in w:
# 单词的莫尔斯码
ms += mrsm[ord(c) - 97]
res.append(ms)
ma = 0
dic = {}
for r in res:
# 统计莫尔斯吗的种类
if r not in dic:
dic[r] = 1
else:
dic[r] += 1
count = len(dic.keys())
print("不同的变换:", count)
3. 排序列表中最接近元素
3.1 问题描述
在一个排好序的数组A
中找到i
,使得A[i]
(数组A
中第i
个数)最接近目标数target
,输出i
。
3.2 问题示例
输入[1,2,3]
,目标数target=2
,输出1
,即A[1]
与目标数最接近;
输入[1,4,6]
,目标数target=3
,输出1
,即A[1]
与目标数最接近。
3.3 问题提示
可以认定为求最小值。最直接的方案是,计算列表中每一个数字与目标数字的差,然后再求最小值。
3.4 编码实现
方案一:
num = [1, 4, 6]
target=3
res=[]
for i in num:
res.append(abs(target-i))
print(min(res))
方案二:
num=[1,4,6]
target=3
mi=abs(num[0]-target)
pos=0
for i in range(1,len(num)):
if abs(target-num[i])<mi:
mi=abs(target-num[i])
pos=i
print(pos)
三、Python 三班
1. 利用递归方法求阶乘之和
1.1 问题描述
计算 1!+2!+3!+4!+5!
等于多少。
1.2 问题示例
本题要求先编写计算某一个数字阶乘的递归函数。
1.3 问题提示
要求使用递归方案,可以认为 5!=5X4!,4!=4X3!,3!=3X2!,2!=2X1!,1!=1
。
1.4 编码实现
def get_jc(num):
if num==1:
return 1
return num*get_jc(num-1)
s=0
for i in range(1,6):
s+=get_jc(i)
print(s)
2. 递归实现将所输入的5个字符,以相反顺序打印出来
2.1 问题描述
程序运行时,能接受用户输入5 个字符组成的字符串,程序运行后,以相反顺序输出字符串。
2.2 问题示例
如输入 abcde
,输出 edcba
。
2.3 问题提示
要求使用递归实现。
2.4 编码实现
def output(s, l):
if l == 0:
return
print(s[l - 1],end='')
output(s, l - 1)
s = input('Input a string:')
l = len(s)
output(s, l)
3. 使用递归求解列表的和
3.1. 问题描述
给一个列表如: a[ 0,1,2,3,4,5,6,9,8]
使用递归的方式求和。
3.2. 问题示例
如:a=[1,2,3]
,结果为:6
。
3.3 问题提示
要求,使用递归实现。
3.4 编码实现
num = [0, 1, 2,4,5]
def get_sum(num):
if len(num) == 1:
return num[0]
return num[0] + get_sum(num[1:])
res = get_sum(num)
print(res)