python编程之列表习题(3个)
1、题目1:猴子选大王
【问题描述】要从n只猴子中选出一位大王。它们决定使用下面的方法:
n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。
【输入形式】控制台输入三个整数n,m,q。
【输出形式】输出最后选为大王的猴子编号
2、明确思路:把第q只猴子当成第一只猴子进行,把每只猴子对应列表中的位置令为1,进行操作,淘汰的猴子令为0,最后再进行判断即可。注意,最后得出的猴子序号要加上q-1返回原本对应的猴子编号 ,另外返回得出的编号大于猴子总数,这时对猴子总数求余即可。
难度系数:三颗星
3、代码如下:
N,m,q= input().split()
N=int(N)
m=int(m)
q=int(q)
stand = []
for i in range(N):
stand.append(1)
c=0
n = N
while n>=2:
for i in range(0,N):
if stand[i]==1:
c = c+1
if c==m:
stand[i] = 0
c = 0
n = n-1
num=stand.index(1)+q
print(num%N)
4、【样例输入】
7 4 3
【样例输出】
4
5、题目2:造句练习
【问题描述】假设有三个列表: Ist who=小马,"小羊,"小鹿], Ist where草地上,电影院,家里], Ist what=看电影,听故事’吃晚饭]。写出所有造句结果
6、明确思路:使用循环嵌套,遍历每种情况,将每种组合进行输出
难度系数:一颗星
7、代码如下:
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
sys.stdin = io.TextIOWrapper(sys.stdin.buffer,encoding='utf-8')
who=["小马","小羊","小鹿"]
where=["草地上","电影院","家里"]
what=["看电影","听故事","吃晚饭"]
ls=[]
for i in range(3):
for j in range(3):
for t in range(3):
ls.append(str(who[i])+"在"+str(where[j])+str(what[t]))
for i in ls:
print(i)
8、【样例输出】
小马在草地上看电影
小马在草地上听故事
小马在草地上吃晚饭
小马在电影院看电影
小马在电影院听故事
小马在电影院吃晚饭
小马在家里看电影
小马在家里听故事
小马在家里吃晚饭
小羊....
9、题目三:求二维整型数组“鞍点”
【问题描述】
求二维整型数组的鞍点。二维数组的;鞍点定义为:某个数是所在行的最大值,并且是所在列的最小值。
【输入形式】
从控制台读入二维数组。
第一行只有以空格分隔的两个正整数n和m(n,m<=10),n代表二维数组的行数,m代表二维数组的列数。
然后在后续n行上输入二维数组的元素,每行有m个以若干空格分隔的整数,代表二维数组在该行上的所有元素。
【输出形式】
向控制台输出二维数组的鞍点,按行下标、列下标从小到大的顺序输出,每行一个,先输出鞍点数值,再输出对应的行下标、列下标(下标从1开始),以空格分隔。若没有鞍点,则输Noanswer。
10、明确思路:先解决二维数组的输入,再进行计算,具体思路标注在如下代码中。
难度系数:五颗星
11、m,n=input().split()
m=int(m)
n=int(n)
ls=[]
lt=[]
dp=[]
#输入并转换为数值列表
for i in range(m):
a=list(input().split())
for j in range(n):
a[j]=int(a[j])
ls.append(a)
#选每行最大值
for i in range(m):
b=max(ls[i])
#判断有无重复最大值
if ls[i].count(b)==1:
c=ls[i].index(b)
#选列最小值
for k in range(m):
lt.append(ls[k][c])
d=min(lt)
#判断该点是否为鞍点
if b==d:
dp.append([b,i+1,c+1])
lt.clear()
#再判断重复为二,步骤同上
elif ls[i].count(b)==2:
c=ls[i].index(b)
for k in range(m):
lt.append(ls[k][c])
d=min(lt)
if b==d:
dp.append([b,i+1,c+1])
lt.clear()
ls[i][c]=0
o=max(ls[i])
p=ls[i].index(o)
for k in range(m):
lt.append(ls[k][p])
d=min(lt)
if b==d:
dp.append([b,i+1,p+1])
lt.clear()
#判断有无鞍点
if len(dp)==0:
print('No answer')
else:
#将数值列表转换成字符串列表,再将列表转换成字符串输出
for i in dp:
i=[str(g) for g in i]
j=' '.join(i)
print(j)
12、【样例输入】
3 4
8 60 7 100
10 49 12 49
-71 132 4 85
【样例输出】
49 2 2
49 2 4
13、经验总结:对于刚学习这一部分的人来说,第三题会比较困难,一些基础操作不会,对于我自己,有些操作没有学过,就自己上网查,但是一般问题没办法直接得到解决,甚至有些信息是不太准确的,我都是查一点资料联系自己的方式理解一点,然后慢慢思考,有的时候一道题比较难的时候会花两三天时间才能解决。不过,当每次思考出来的时候会觉得收获很多,长期累积,做题的经验也会很多,碰到难题心里也不会慌了。