AI实战营Python编程作业

举报
Jay_Ciao 发表于 2021/11/19 14:08:24 2021/11/19
【摘要】 2021华为云AI实战营系列活动之AI编程Python实战营之Python编程知识阶段作业
1.逆序除重

输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。 保证输入的整数最后一位不是0

st = input("请输入字符串:")
st1=st[::-1]
res=''
for i in st1:
    if i not in res:
        res += i
print(res)
2.简单的加法

输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,如果有多对数字的和等于输入的数字,输出任意一对即可。

l = input("请输入字符串:")
list1 = l.split(',')
list1.sort()
lt = []
for i in list1:
    lt.append(int(i))
n = input("请输入要查找的值:")
i1 = int(n)
​
def findU(list, num):
    i = 0
    j = len(list) - 1
    while i < j:
        if list[i] + list[j] < num:
            i += 1
        elif list[i] + list[j] > num:
            j -= 1
        else:
            print("%d,%d" % (list[i], list[j]))
            return
    print("No values match")
​
findU(lt, i1)
3.字符串作业

输入一个字符串,求最大的没有重复字符的子字符串长度

l = input("请输入字符串:")
# l = 'huaweicloudaigallery'
dict1={}
maxC=0
for i in range(len(l)):
    zf = ''
    for j in range(i,len(l)):
        cc=str(l[j])
        if cc not in zf:
            zf += cc
        else:
            if j-i>maxC:
                maxC=j-i
                dict1[maxC]=zf
            break
print(dict1)
4.奇妙的三元组

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

简单版:
nums = [-1, 0, 1, 2, -1, 1, 4]
nums.sort()
lenth = len(nums)
res = []
for i in range(lenth - 3):  # a
    for j in range(i+1, lenth - 2):  # b
        for k in range(j+1, lenth - 1):  # c
            if nums[i] + nums[j] + nums[k] == 0:
                tmp=[nums[i],nums[j],nums[k]]
                if tmp not in res:
                    res.append(tmp)
print(res)
升级1:减少循环次数
nums = [-1, 0, 1, 2, -1, 1, 4]
nums.sort()
result = []
# 在每一层多加判断
for i in range(len(nums) - 3):
    if i == 0 or nums[i] != nums[i - 1]:
        k = len(nums) - 1
        for j in range(i + 1, len(nums) - 2):
            if j == i + 1 or nums[j] != nums[j - 1]:
                while j < k and nums[i] + nums[j] + nums[k] > 0:
                    k = k - 1
                # 如果指针重合,随着 k 后续的增加
                # 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环
                if j == k:
                    break
                if nums[i] + nums[j] + nums[k] == 0:
                    result.append((nums[i], nums[j], nums[k]))
​
if len(result) >0:
    print(result)
else:
    print("not found")
5.学习成绩划分

输入一个0-100之间的整数成绩:

学习成绩>=90的同学,用A表示;

学习成绩60-89分的同学,用B表示;

学习成绩<60的同学,用C表示。

l = input("请输入成绩:")
score = int(l)
if score>=90:
    print('A')
elif score<60:
    print('C')
else:
    print('B')
6.奖金分配

企业发放的奖金根据利润提成:

利润(I)低于或等于10 万元时,奖金可提10%;

利润高于10 万元,低于20 万元时,低于10 万元的部分按10%提成,高于10 万元的部分,可可提成7.5%;

20 万到40 万之间时,高于20 万元的部分,可提成5%;

40 万到60 万之间时高于40 万元的部分,可提成3%;

60 万到100 万之间时,高于60 万元的部分,可提成1.5%;

高于100 万元时,超过100 万元的部分按1%提成,

从键盘输入当月利润I,求应发放奖金总数?

l = input("请输入利润:")
fl = float(l)
​
def priceCal(money):
    tag = 0
    res = 0
    calRange = [0, 10, 20, 40, 60, 100]
    calRite = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]
    for i in range(len(calRange) - 1):
        #找到边界
        if money > calRange[i] and money <= calRange[i + 1]:
            res = (money - calRange[i]) * calRite[i]
            tag = i
            break
        elif money > calRange[-1]:
            res = (money - calRange[-1]) * calRite[-1]
            tag = len(calRange) - 1
        #循环计算
    if tag >0:
        for j in range(tag):
            res += (calRange[j+1]-calRange[j])*calRite[j]
    print(res)
​
priceCal(fl)
7.回文检查器

如果给定的一个字符串是回文,那么返回true,否则返回false。指在忽略标点符号、大小写和空格的前提下,正着读和反着读一模一样

import re
r = "[^0-9A-Za-z\u4e00-\u9fa5]"  # 匹配字符
text = "`a2.W`.A2';w2A/[w2a"
res = re.sub(r, '', text).lower()
revers = res[::-1]
if res == revers:
    print("此字符串是回文")
else:
    print("非回文")
8.罗马数字转换器

把传入的数字转变为罗马数字。(0~9)

转换后的罗马数字字母必须都是大写。

s = '2091378'
romaNum = ['N', 'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ']
res = ''
for i in range(len(s)):
    index = int(s[i])
    res += romaNum[index]
print(res)
9.凯撒密码

世界上最简单、最著名的加密方法是凯撒密码,也叫移位密码。在移位密码中,明文中的字母通过按照一个固定数目进行偏移后被替换成新的字母。ROT13 是一个被广泛使用的编码技术,明文中的所有字母都被移动 13 位。因此,'A' ↔ 'N', 'B' ↔ 'O' 等等。请编写一个函数,用于解码一个被 ROT13 编码的字符串,然后返回解码后的结果。所有解码后的字母都必须为字母大写。请不要解码非字母的字符(例如,空格、标点符号),但你需要在结果中保留它们

sr = 'dwq2i[;da2'
​
def rotB(sr):
    res = ''
    for i in range(len(sr)):
        ch = str(sr[i]).upper()
        if 'A' <= ch <= 'Z':
            if ord(ch)+13 <= ord('Z'):
                res += chr(ord(ch)+13)
            else:
                tmp = ord(ch)+13-ord('Z')+ord('A')-1
                res += chr(tmp)
        else:
            res += ch
    print(res)
​
rotB(sr)
10.魔法棒

小明有一个魔法棒,魔法棒有很多功能,其中最简单的是对字母的改变:可以将大写字母变成小写字母(A->a,B->b,C->c…Z->z),将小写字母变成大写字母(a->A…z->Z),魔法对数字不生效。

sr = '2sOUWj02j'
​
def trans(sr):
    res=''
    for i in range(len(sr)):
        ch = str(sr[i])
        if 'A'<=ch<='Z':
            ch=ch.lower()
        elif 'a'<=ch<='z':
            ch=ch.upper()
        res += ch
    print(res)
    
trans(sr)
11.扫雷

定一个矩形方正区域,里面有若干个地雷,用鼠标点击,点击后如果出现一块区域,那么说明这个点周围8个方向没有地雷,如果出现数字,数字是几,那么就表示这个区域周围8个方向有几颗地雷。现在告诉你这个图里地雷的分布,你来给出每个点上面的数字应该是多少?

raws = int(input("请输入雷区行数:"))
cols = int(input("请输入雷区列数:"))
import numpy as np
myarr = np.random.randint(0, 2, (raws, cols))
print(myarr)
res = []  # 扫雷结果
for i in range(raws):  # 遍历行
    sr = ''  # 存储每行扫雷结果
    for j in range(cols):  # 遍历列
        if myarr[i][j] == 1:
            sr += 'X'
        else:   #构建九宫格
            ct=0
            scan={-1,0,1}
            for x in scan:
                if 0<=x+i<raws:
                    for y in scan:
                        if 0<=j+y<cols:
                            if myarr[x+i][j+y] == 1:
                                ct +=1
            sr += str(ct)
    res.append(sr)
print(res)
12.电话号码验证器

如果传入的字符串是一个有效的中国电话号码格式,则返回true。 例如: 134-4562-5655 13469587456 1314 122 9899

import re
sr = input("请输入疑似的手机号:")
r = "[^0-9]"
res = re.sub(r, '', sr)
print(res)
if res.startswith('1') and len(res)==11:
    print("这是中国手机号")
else:
    print("这不是中国手机号")
13.生日提取

提取所有人的生日

需要匹配的 -- 需要提取的

  • 刘伟 1996.8.24 - - 8 24

  • 李伟 1993年1月2日 - - 1 2

  • 聂芳 1997-7-24 - - 7 24

编写一个正则表达式,使得以上所有的生日都能被正确提取

# // 前瞻:
# exp1(?=exp2) 查找exp2前面的exp1
# // 后顾:
# (?<=exp2)exp1 查找exp2后面的exp1
# // 负前瞻:
# exp1(?!exp2) 查找后面不是exp2的exp1
# // 负后顾:
# (?<!exp2)exp1 查找前面不是exp2的exp1
import re
sr = {'刘伟 1996.8.24', '李伟 1993年12月2日', '聂芳 1997-7-24','张三 1988/2/13'}
for i in sr:
    r = '(?<=[./年月-])\d+'   
    res = re.findall(r, i)
    print(i)
    print('%s %s' % (str(res[0]),str(res[1])))
14.被选中的孩子

有个游戏参加者很多需要筛选,主办方的选择孩子的标准如下: n个孩子从左到右站成一排,每个孩子都有一个分数(该分数为正整数),要求所选出的孩子们必须是连续的一段,而且所选出的孩子的分数的平均值必须大于等于预先给定的一个常数b。但是这样选择的方法可能并不唯一,请问有几种选法呢?

输入:第一行:输入候选孩子的个数n(1<=n<=20000)和给定的常数b(1<=b<=500) 接下来n行:输入n个孩子的分数Xi(i=1,2,…)且1<=Xi<=500。

输出:输出选择的种数。

输入样例:5 9 32 4 9 21 10

输出样例:13

d = 9
Xi = [32, 4, 9, 21, 10]
n = len(Xi)
ct = 0
for i in range(1, n + 1):
    for j in range(n - i + 1):
        sm = sum(Xi[j:j + i])
        if sm / i >= d:
            ct += 1
print(ct)
15.弟弟的作业

你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符”?”,表示他不会算。

输入:输入文件的第一行只有一个数字T(1 <= T <= 1000),表示下面有T个算术运算,接下来有T行,每行包含一道题目,格式有以下4种情况: a+b=c a-b=c a+b=? a-b=? 其中0 <= b <= a <= 100,0 <= c <= 200,且不包含任何空白字符。输入的所有整数均不含前导0。

输出:输出仅一行一个数字,表示”a+b=c”和”a-b=c”中计算正确的个数。

样例:输入样例 4 1+2=3 3-1=5 6+7=? 99-0=99 输出样例 2

hw = ['3+5=8', '-1-2=3', '20-5=15', 
      '3-5=-2', '169-31=?', '-6+16=10']
t = len(hw)
ct=0
for i in hw:
    equal = i.split('=')
    left=equal[0]   #等号左边
    right=equal[1]  #等号右边
    if right.find('?') == -1: #过滤出算出来的题
        a=0
        b=0
        if left.find('+') != -1: #等号左边有+号
            nums = left.split('+')
            a=int(nums[0])
            b=int(nums[1])
        else: # 如果等号左边无加号,则有可能a为负数
            jh = left.find('-',1,)
            a=int(left[0:jh])
            b=int(left[jh:])
        c = int(right)
        if a+b==c:
            print('%d %d %d' % (a, b, c))
            ct+=1
​
print(ct)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。