前言
Hello!小伙伴!
非常感謝您閱讀海轟的文章,倘若文中有錯誤的地方,歡迎您指出~
自我介紹 ?(?ˊ?ˋ)?
昵稱:海轟
標簽:程式猿|C++選手|學生
簡介:因C語言結識編程,隨后轉入計算機專業,有幸拿過國獎、省獎等,已保研,目前正在學習C++/Linux(真的真的太難了~)
學習經驗:扎實基礎 + 多做筆記 + 多敲代碼 + 多思考 + 學好英語!
往期題目集
【PTA|Python】浙大版《Python 程式設計》題目集:第一章
【PTA|Python】浙大版《Python 程式設計》題目集:第二章
【PTA|Python】浙大版《Python 程式設計》題目集:第三章
【PTA|Python】浙大版《Python 程式設計》題目集:第四章
【PTA|Python】浙大版《Python 程式設計》題目集:第五章
第六章
6-1 輸入串列,求串列元素和(eval輸入應用) (10 分)
題目
在一行中輸入串列,輸出串列元素的和,
?
輸入格式:
一行中輸入串列,
輸出格式:
在一行中輸出串列元素的和,
輸入樣例:
[3,8,-5]
輸出樣例:
6
解答
提交代碼 - 1
lst=eval(input())
print(eval('+'.join('%s' %id for id in lst)))

提交代碼 - 2
print(sum(eval(input())))

6-2 一幫一 (15 分)
題目
“一幫一學習小組”是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠后的學生排在一組,
本題就請你撰寫程式幫助老師自動完成這個分配作業,即在得到全班學生的排名后,在當前尚未分組的學生中,將名次最靠前的學生與名次最靠后的異性學生分為一組,
?
輸入格式:
輸入第一行給出正偶數N(≤50),即全班學生的人數,此后N行,按照名次從高到低的順序給出每個學生的性別(0代表女生,1代表男生)和姓名(不超過8個英文字母的非空字串),其間以1個空格分隔,這里保證本班男女比例是1:1,并且沒有并列名次,
輸出格式:
每行輸出一組兩個學生的姓名,其間以1個空格分隔,名次高的學生在前,名次低的學生在后,小組的輸出順序按照前面學生的名次從高到低排列,
輸入樣例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
輸出樣例:
Amy Jack
Tom Linda
Bill Maya
Cindy John
解答
#!/usr/bin/python3
# 存盤所有學生的名字 根據名次排序
students = []
# 存盤女孩的名字 根據名次排序
girl = []
# 存盤男孩的名字 根據名次排序
boy = []
n = int(input())
for i in range(n):
student = input().split()
students.append(student[1])
if student[0] == '0':
boy.append(student[1])
else:
girl.append(student[1])
# 遍歷前4名
for i in range(n//2):
# 如果是男孩
if students[i] in boy:
# 找到該孩子在男孩中的名次 與index對應 比如在第1名index為0
# 男孩中的第一個應該與女孩中的最后一個組合
# 所以 男孩的索引為index 那么女孩的索引就是-1-index
# -1表示最后一個 再-index表示往前幾個
# 例如:-1-1 表示再最后一個的基礎上再前進2個元素
index = boy.index(students[i])
print("{} {}".format(students[i], girl[-1-index]))
else:
index = girl.index(students[i])
print("{} {}".format(students[i], boy[-1-index]))

6-3 串列或元組的數字元素求和 (20 分)
題目
求串列中數字和,串列中嵌套層次不限2層
?
輸入格式:
在一行中輸入串列或元組
輸出格式:
在一行中輸出數字的和
輸入樣例:
在這里給出一組輸入,例如:
[11,2,[3,7],(68,-1),“123”,9]
輸出樣例:
在這里給出相應的輸出,例如:
99
解答
注意題目中只需要求的是數字和
?
例子:[11,2,[3,7],(68,-1),“123”,9] 中“123”屬于字串,不再計算范圍內
?
正確計算是:11+2+3+7+68+(-1)+9=99
撰寫代碼時注意不要將字串也納入計算范圍內了,注意提取正確的數字,避開字串(開始還沒有注意到)
#!/usr/bin/python3
s = input()
# s為字串
# 首先將[]()替換
s = s.replace('[', '')
s = s.replace(']', '')
s = s.replace('(', '')
s = s.replace(')', '')
# 注意”123“屬于字串 不屬于數字 我們是不需要的
s2 = ""
# 記錄”的個數
count = 0
# 遍歷s
# 統計“的個數 如果為偶數且不為” 說明為數字
for i in s:
if i == '"':
count += 1
if count % 2 == 0 and i != '"':
s2 += i
# 替換逗號
s2 = s2.replace(',', ' ')
# 注意可能兩個數中間原來有兩個逗號 替換后就有兩個空格
# 再利用split() 提取元素 轉化為list型別
s2 = s2.split()
ans = 0
# 遍歷s2 list型別
for i in s2:
ans += int(i)
print(ans)

6-4 串列數字元素加權和(1) (40 分)
題目
輸入一個嵌套串列,嵌套層次不限,根據層次,求串列元素的加權和,第一層每個元素 的值為:元素值1,第二層每個元素的值為:元素值2,第三層每個元素的值為:元素值*3, …,以此類推!
?
輸入格式:
在一行中輸入串列
?輸出格式:
在一行中輸出加權和
輸入樣例:
在這里給出一組輸入,例如:
[1,2,[3,4,[5,6],7],8]
輸出樣例:
在這里給出相應的輸出,例如:
72
解答
有幾個需要注意的地方:
- 其中的數字可以為兩位數、三位數
- 數字也可以為負數
提供的一些測驗資料
- [1]
- [-1]
- [1,[19,1],2]
- …
踩坑:如果開始以字串讀取,再逐一讀取字符,需要注意每次讀取只得到一個字符,比如字串“234”,讀取是2、3、4 這個地方易錯
# 以字串型別讀入資料
s = input()
# count:統計[、]字符的個數 遇到[ +1 遇到] -1
count = 0
# ans:最后結果
ans = 0
# 字串索引
index = 0
# 判斷一個數是負數還是正數
flag = 1
# 遍歷字串
while index < len(s):
# 遇到[ 層級+1
if s[index] == '[':
count += 1
# 遇到] 層級-1
elif s[index] == ']':
count -= 1
# 遇到 '-' 說明之后的數字為負數
elif s[index] == '-':
flag = -1
# 如果是一個數字 則需要判斷后面是否接著為數字
# 如果是 還得拼接數字 比如23
# 因為是逐個字符讀取
# 每次只讀一個字符
# 讀到2時 還需要判斷后面是否還是數字
# 如果是 需要拼接為23
elif s[index].isdigit():
index2 = index
num = 0
while s[index2].isdigit():
num = num*10+int(s[index2])
index2 += 1
# 更新index
index = index2-1
# 更新ans 注意正負號
ans = ans+count*num*flag
# 最后需要將flag再次設定為1
flag = 1
index += 1
print(ans)

6-5 串列元素個數的加權和(1) (40 分)
題目
輸入一個嵌套串列,嵌套層次不限,根據層次,求串列元素的加權個數和,第一層每個元素算一個元素,第二層每個元素算2個元素,第三層每個元素算3個元素,第四層每個元素算4個元素,…,以此類推!
?
輸入格式:
在一行中輸入一個串列,
輸出格式:
在一行中輸出加權元素個數值,
輸入樣例:
在這里給出一組輸入,例如:
[1,2,[3,4,[5,6],7],8]
輸出樣例:
在這里給出相應的輸出,例如:
15
解答
在上一題思路上簡化即可
s = input()
count = 0
ans = 0
index = 0
while index < len(s):
if s[index] == '[':
count += 1
elif s[index] == ']':
count -= 1
# elif s[index]=='-':
# flag=-1
elif s[index].isdigit():
index2 = index
while s[index2].isdigit():
index2 += 1
index = index2-1
ans = ans+count
index += 1
print(ans)

第6章-6 求指定層的元素個數 (40 分)
題目
輸入一個嵌套串列,再輸入層數,求該層的數字元素個數,
?
輸入格式:
第一行輸入串列 第二行輸入層數
輸出格式:
在一行中輸出元素個數
輸入樣例:
在這里給出一組輸入,例如:
[1,2,[3,4,[5,6],7],8] 3
輸出樣例:
在這里給出相應的輸出,例如:
2
解答
s = input()
n=int(input())
count = 0
ans = {}
index = 0
while index < len(s):
if s[index] == '[':
count += 1
elif s[index] == ']':
count -= 1
elif s[index].isdigit():
index2 = index
while s[index2].isdigit():
index2 += 1
index = index2-1
ans[count]=ans.get(count,0)+1
index += 1
print(ans[n])

6-7 找出總分最高的學生 (15 分)
題目
給定N個學生的基本資訊,包括學號(由5個數字組成的字串)、姓名(長度小于10的不包含空白字符的非空字串)和3門課程的成績([0,100]區間內的整數),要求輸出總分最高學生的姓名、學號和總分,
?
輸入格式:
輸入在一行中給出正整數N(≤10),隨后N行,每行給出一位學生的資訊,格式為“學號 姓名 成績1 成績2 成績3”,中間以空格分隔,
輸出格式:
在一行中輸出總分最高學生的姓名、學號和總分,間隔一個空格,題目保證這樣的學生是唯一的,
輸入樣例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
輸出樣例:
zhangfeng 10001 258
解答
n = int(input())
maxSumGrades = 0
maxSumGradesIndex = 0
students = []
for i in range(n):
student = list(input().split())
sumGrades = 0
for j in range(2, 5):
sumGrades += int(student[j])
if sumGrades > maxSumGrades:
maxSumGrades = sumGrades
maxSumGradesIndex = i
students.append(student)
print("{} {} {}".format(students[maxSumGradesIndex][1], students[maxSumGradesIndex][0], maxSumGrades))

6-8 輸出全排列 (20 分)
題目
輸入整數n(3<=n<=7),撰寫程式輸出1,2,…,n整數的全排列,按字典序輸出,
?
輸入格式:
一行輸入正整數n,
輸出格式:
按字典序輸出1到n的全排列,每種排列占一行,數字間無空格,
輸入樣例:
在這里給出一組輸入,例如:
3
輸出樣例:
在這里給出相應的輸出,例如:
123
132
213
231
312
321
解答
1-n的全排列(3<=n<=7)
最小數一定是:123…45…n
最大數是:n…54…321
思路(暴力回圈):
- 從123…n 到 n…321 依次遍歷
- 對其進行set操作
- 當set(num)==set(“123…n”)時
- 說明是符合條件的全排列
n = int(input())
ls = [str(i) for i in range(1, n+1)]
s = "1234567"
# beg=123...n
beg = int(s[:n])
# end=n...321
end = int(s[n-1::-1])
for x in range(beg, end+1):
if set(str(x)) == set(ls):
print(x)

結語
文章僅作為學習筆記,記錄從0到1的一個程序
希望對您有所幫助,如有錯誤歡迎小伙伴指正~
我是 海轟?(?ˊ?ˋ)?
如果您覺得寫得可以的話,請點個贊吧
謝謝支持 ??

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/290278.html
標籤:python
