Python 作业答疑_6.15~6.18

一、Python 一班

1. 比较字符串

1.1 问题描述

比较两个字符串AB,字符串AB中的字符都是大写字母,确定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 问题描述

给两个字符串ST,判断S能不能通过删除一些字母(包括0个)变成T

2.2 问题示例

输入为S="longterm"T="long",输出为True

2.3 问题提示

要求不能使用循环嵌套;不能使用字符串相应的查找方法。只能使用基础语法自行设计算法实现。

时间复杂度要控制在 O(n),本题和上题的是不相同的,请注意审题。TS的一个子字符串。

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写成-.-.-....-,(把cab的莫尔斯码串接起来),即为一个词的转换。

返回所有单词中不同变换的数量。

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚大果壳

码文不易,晚上熬夜需要点咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值