当前位置: 首页 > article >正文

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)

http://www.kler.cn/a/161414.html

相关文章:

  • kafka面试题解答(四)
  • HarmonyOS SDK下的实践与探索
  • matlab建模入门指导
  • VMware虚拟机安装Win7专业版保姆级教程(附镜像包)
  • pip3 install -e .[stable]讲解
  • DApp开发:定制化解决方案与源码部署的一站式指南
  • Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配
  • json转yolo格式
  • 大屏可视化基础学习-通用可套用模板【大屏可视化项目案例-15】
  • 每日一题:LeetCode-11.盛水最多的容器
  • Android11适配已安装应用列表
  • ZKP Understanding Nova (2) Relaxed R1CS
  • ESP32-Web-Server编程- 在 Web 上开发动态纪念册
  • 二叉树的层平均值[中等]
  • Python作业答疑_6.22~6.25
  • C语言基础概念考查备忘 - 标识符、关键字、预定义标识符、语法检查、语义检查 ... 左值、右值、对象、副作用、未定义行为、sizeof是什么等等
  • 26.Oracle11g的数据装载
  • Zabbix 6.0部署+自定义监控项+自动发现与自动注册+部署zabbix代理服务器
  • 【跨境营商】创新科技助力数码转型 增强大湾区企业核心竞争力
  • 08-中介者模式-C语言实现
  • HarmonyOS4.0系列——03、声明式UI、链式编程、事件方法、以及自定义组件简单案例
  • 如何配置WinDbg和VMware实现内核的调试
  • appium :输入框控件为android.view.View 时输入内容(如:验证码、密码输入框)
  • Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境
  • Java SpringBoot Controller常见写法
  • SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel | 京东云技术团队