【题目描述-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)



