个人的python做题记录(二)

个人的python做题记录(二),第1张

个人的python做题记录(二)

【题目描述-1】

L1-010 比较大小

本题要求将输入的任意3个整数从小到大输出

输入格式: 输入在一行中给出3个整数,其间以空格分隔。

输出格式: 在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例: 4 2 8

输出样例: 2->4->8

lst_int = list(map(int, input().split()))
lst_int.sort()
print(f'{lst_int[0]}->{lst_int[1]}->{lst_int[2]}')


【题目描述-2】

L1-008 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

输入格式: 输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式: 首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。

输入样例:

-3 8

输出样例:

   -3   -2   -1    0    1

    2    3    4    5    6

    7    8

Sum = 30

 【个人思路】

思路没有新颖点,主要是注意输出的格式。 (我用 print('r') 时,提交结果会显示格式错误)

A, B = input('给出2个整数A和B,−100≤A≤B≤100,以空格分隔').split()
# print(A, B, type(A), type(B))
i = 0
Sum = 0
for n in range(int(A), int(B)+1):
    i += 1
    if i != 5:
        print('%5d' % n, end='')
    if i == 5:
        print('%5d' % n)
        i = 0
    Sum += n
if len(range(int(A), int(B)+1)) % 5 != 0:
    print()
print('Sum = %d' % Sum)


 【题目描述-3】

L1-015 跟奥巴马一起画方块

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。 2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。 现在你也跟他一起画吧!

输入格式: 输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。

输出格式: 输出由给定字符C画出的正方形。但是注意到行间距比列间距大, 所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。

输入样例:

10 a

输出样例:

aaaaaaaaaa

aaaaaaaaaa

aaaaaaaaaa

aaaaaaaaaa

aaaaaaaaaa

N, char = input().split()
column = int(N)
row = int(column * 0.5 + 0.5)    # 加 0.5 ,再int(),可以做到‘四舍五入’
# print(column, row)
for r in range(0, row):
    for c in range(0, column):
        print(f'{char}', end='')
    print()


 【题目描述-4】

L1-007 念数字

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。

十个数字对应的拼音如下:

0: ling ,1: yi ,2: er ,3: san ,4: si ,5: wu ,6: liu ,7: qi ,8: ba ,9: jiu

输入格式: 输入在一行中给出一个整数,如:1234。

提示:整数包括负数、零和正数。

输出格式: 在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。

输入样例:

-600

输出样例:

fu liu ling ling

【个人思路】

思路很简单,对输入的 N 进行遍历,拿到每一位数字,匹配该数字对应的拼音,输出即可

不过在写代码时也有几个比较特殊的地方需要考虑

N = input('在一行中给出一个整数,如:-1234')
num_list = [n for n in N]       # print(num_list)
dct = {'0': 'ling',
       '1': 'yi',
       '2': 'er',
       '3': 'san',
       '4': 'si',
       '5': 'wu',
       '6': 'liu',
       '7': 'qi',
       '8': 'ba',
       '9': 'jiu'}        # 创建一个字典
if int(N) < 0:
    print('fu', end=' ')
if len(N) == 1:        # 当 N 仅为一位非负整数时
    print(dct[N])
else:
    i = 0
    while True:
        for i in range(0, len(N)-1):  # 不能取到最后一个数字,即不输出最后一个数字的拼音
            key = num_list[i]
            if key in dct:
                print(dct[key], end=' ')
        break
    key = num_list[i+1]
    print(dct[key])        # 此处输出最后一个数字的拼音


【题目描述-5】

L1-003 个位数统计

给定一个 k 位整数 N , 请编写程序统计每种不同的个位数字出现的次数。

例如:给定 N=100311,则有 2个0,3个1,1个3。

输入格式: 每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式: 对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。 要求按 D 的升序输出。

输入样例:

100311

输出样例:

0:2

1:3

3:1

【个人思路】

对输入的 N 进行遍历,拿到 N 的每一位数字,然后用if判断,记录每一种不同的数字它出现的次数

N = input('请输入一个不超过1000位的正整数N=')        # 是1000位,不是1000
amount = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]
for i in N:        # N 是 str 类型,可以对其进行遍历,遍历的结果 i 也是 str 类型
    if i == '0':
        amount[0] += 1
    elif i == '1':
        amount[1] += 1
    elif i == '2':
        amount[2] += 1
    elif i == '3':
        amount[3] += 1
    elif i == '4':
        amount[4] += 1
    elif i == '5':
        amount[5] += 1
    elif i == '6':
        amount[6] += 1
    elif i == '7':
        amount[7] += 1
    elif i == '8':
        amount[8] += 1
    else:               # i == '9':
        amount[9] += 1
for i in range(0, 10):
    if amount[i] != 0:
        print(f'{i}:{amount[i]}')


【题目描述-6】

L1-005 考试座位号

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。 正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。 但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:

输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。 其中准考证号由 16 位数字组成,座位从 1 到 N 编号。 输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。 考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样例:

4

3310120150912233 2 4

3310120150912119 4 1

3310120150912126 1 3

3310120150912002 3 2

2

3 4

输出样例:

3310120150912002 2

3310120150912119 1

"""
(思路描述的不太清楚)
这里我用元组把学号,试机座位号,考试座位号三个要素绑定在一起
一个元组存放一个学生的信息三要素
把所有的元组放进一个列表中,这个列表相当于学生信息库
当输入待查询的试机座位号码时,匹配列表中对应元组的位置,然后输出结果
"""

N = int(input())
student = []        # “学生信息库”
for i in range(0, N):
    ID_num, test_num, exam_num = input().split()
    student.append((ID_num, test_num, exam_num))
M = int(input())
search = input().split(sep=' ', maxsplit=M-1)
for i in range(0, M):
    for n in range(0, N):
        if search[i] == student[n][1]:
            print(student[n][0], student[n][2])
"""
(思路描述的不太清楚)
这里我用字典把学号,考试座位号两个要素绑定在一起
把所有字典放进一个列表中
把试机座位号放进另一个列表中,作为‘索引’
当输入待查询的试机座位号码时,匹配列表中对应字典的位置,然后输出结果
"""

N = int(input())
student = []        # 存放学生信息
index = []
for i in range(0, N):
    ID_num, test_num, exam_num = input().split()
    index.append(test_num)
    student.append({ID_num: exam_num})
M = int(input())
search = input().split(sep=' ', maxsplit=M-1)
for i in range(0, M):
    for n in range(0, N):
        if search[i] == index[n]:        # n 同时作为 ID 和 student 的索引
            for key in student[n]:        # 遍历字典 可以拿到 key
                print(key, student[n][key])


【题目描述-7】

L1-011 A-B

本题要求你计算 A−B 。 不过麻烦的是,A 和 B 都是字符串 —— 即从字符串 A 中把字符串 B所 包含的字符(同种字符) 全部删掉 ,剩下的字符组成的就是字符串 A−B 。

输入格式:

输入在两行中先后给出字符串 A 和字符串 B 。 两字符串的长度都不超过 10^4,并且保证每个字符串都是由可见的 ASCII码 和 空白字符 组成,最后以换行符结束。

输出格式:

在一行中打印出 A−B 的结果字符串。

输入样例:

I love GPLT! It's a fun game!

aeiou

输出样例:

I lv GPLT! It's fn gm!

"""
【首先想到的第一个思路】
一个一个遍历,再一个一个对比,相同就删除

详细的说,就是先拿 B 中的一个字符,然后去看 A 中存不存在该字符,如果存在,就remove移除。
         然后再拿 B 中的下一个字符,再去看 A 中是否存在该字符,如果存在,就移除
        ......
        重复上述步骤,直到拿完 B 中的字符为止

但是!!!!!!!!!!!!!
remove()函数,一次仅仅只能移除 A 中的一个字符。
倘若 A 中重复出现该字符,就需要遍历 A 一遍,
把 A 中的所有字符一个一个与该字符比较,然后一个一个移除

每从 B 中拿一个字符,就需要把 A 完整地遍历一遍
(既对 B 遍历,同时又对 A 遍历)
》》》》》》》虽然用代码去实现并不难,但是这样会导致 “运行超时” 《《《《《《《
"""

'''第一次提交结果【运行超时】'''
A = input('输入长度不超过10^4 且由可见的ASCII码和空白字符组成的字符串 A:')
B = input('输入长度不超过10^4 且由可见的ASCII码和空白字符组成的字符串 B:')
lst_A = [item for item in A]        # print(lst_A)
lst_B = [item for item in B]        # print(lst_B)
for item in lst_B:
    for i in lst_A:
        if item in lst_A:
            lst_A.remove(item)       # print(lst_A)
print(''.join(lst_A))        # 连接列表元素,输出的结果是 str 类型
"""
【对第一个思路的小改进】
有这样的情况,可能 B 自己本身中存在重复的字符,如:abcsad 这样,还包括有重复的空格
所有可以用 lst_B = list(set(lst_B)) 去掉重复元素 (虽然元素顺序是随机的,不过这里不影响)
这里利用集合元素的‘互异性’,将列表转换成集合,去掉重复元素,再转换成列表
"""

'''第二次提交结果【部分正确、格式错误】'''
A = input('输入长度不超过10^4 且由可见的ASCII码和空白字符组成的字符串 A:')
B = input('输入长度不超过10^4 且由可见的ASCII码和空白字符组成的字符串 B:')
lst_A = [item for item in A]        # print(lst_A)
lst_B = [item for item in B]        # print(lst_B)
lst_B = list(set(lst_B))        # 去掉重复元素 (虽然元素顺序是随机的,不过这里不影响)
# print(lst_B)
for item in lst_B:
    for i in lst_A:
        if item in lst_A:
            lst_A.remove(item)       # print(lst_A)
print(''.join(lst_A))        # 连接列表元素,输出的结果是 str 类型
"""
尝试另一种思路【输出 A 中 B 没有的字符】
(最后一种思路与前面的思路‘反过来’或者说‘颠倒过来’)
遍历 A 就行了,不用遍历 B,
直接 if item not in B ,可以直接对字符串 B 用 in / not in
"""

'''第三次提交结果【答案正确】'''
A = input('输入长度不超过10^4 且由可见的ASCII码和空白字符组成的字符串 A:')
B = input('输入长度不超过10^4 且由可见的ASCII码和空白字符组成的字符串 B:')
# lst_A = [item for item in A]        # print(lst_A)
for item in A:
    if item not in B:
        print(item, end='')
print()


【题目描述-8】

L1-002 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。

例如给定17个“*”,要求按下列格式打印

*****

 ***

  *

 ***

*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式: 输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式: 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****

 ***

  *

 ***

*****

2

【个人思路】

math.sqrt(N/2 + 1/2),这个题我的思路相当于是用数学公式来计算了

事先根据图形特点,计算出组成一个完整的沙漏所需符号的个数

第一个沙漏 *       1个

第二个沙漏 ***    7个

                    *

                   ***

第三个沙漏 *****  17个

                    ***

                     *

                    ***

                   *****

第 n 个沙漏   ...    2  *n**2 - 1个

给定 N 个符号,对应的第 n 个沙漏

且满足:2 * (n-1)**2 - 1 ≤ N ≤ 2 * n**2 - 1

由 N ≤ 2 * n**2 - 1 ,

得 sqrt(N/2 + 1/2) ≤ n

因为 n 为整数,

所以 n = int(math.sqrt(N/2 + 1/2))

除此之外,就是实现图形打印,见代码

import math
list_input = (input()).split(sep=' ')
N = int(list_input[0])
char = list_input[1]
n = int(math.sqrt(N/2 + 1/2))

# 打印上半部分
for row in range(1, n, 1):
    for i in range(1, row, 1):
        print(' ', end='')    # 打印空格
    for i in range(1, 2*n-2*(row-1), 1):
        print('{0}'.format(char), end='')    # 打印符号
    print()

# 此处是沙漏的最中间,仅由一个符号组成一行
for i in range(1, n, 1):
    print(' ', end='')    # 打印符号前面的空格
print('{0}'.format(char))    # 仅打印一个符号

# 打印下半部分 (与上半部分‘颠倒’)
for row in range(1, n, 1):
    for i in range(1, n-row, 1):
        print(' ', end='')
    for i in range(1, 2*(row+1), 1):
        print('{0}'.format(char), end='')
    print()

# 输出剩下没用掉的符号数
rest_N = N - (2 * n**2 - 1)
print(rest_N)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5711717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存