前情提要:
在不同的答题系统测试代码时,要格外注意提供的输入是什么格式,可以先打印一下type()和内容,再编写函数。还要注意题目要求的输出的格式,这里只需要了解一点‘print打印变量的规则’‘格式化字符串’的知识点即可。
1、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
知识点:约瑟夫问题。注意这里的初始编号是1,而传统的约瑟夫问题初始编号是0。
代码:
import sys
# 主代码
def josephus(n):
if n==1: # 当只有1个人时
return 1
circle=list(range(1,n+1)) # 当大于1个人时,初始化圈子
index=0 # 当前报数的人在圈子中的索引
while len(circle)>1: # 同上,当圈子中超过1个人时
index=(index+2)%len(circle) # 报到3的人的索引
circle.pop(index) # 将报到的人移除圈子
return circle[0]
# 测试
if __name__ == "__main__":
for line in sys.stdin:
a = line.split()
input=int(a[0])
output=josephus(input)
print(output)
2、小陆每天要写一份工作日报,日报标题含有日期。几年后,他翻开以前的日报,想知道两份日报的日期是否同为星期几,请编程帮助他判断。
知识点:datetime库、列表元素的读取
代码:
import sys
from datetime import datetime
# main-code
def wheather_same_time(input): # input : e.g.['1970', '1', '2', '2020', '2', '7']
lst=list(map(int,input))
d1,d2=lst[:3],lst[3:]
w1 = datetime(d1[0],d1[1],d1[2]).isoweekday()
w2 = datetime(d2[0],d2[1],d2[2]).isoweekday()
if w1==w2:
return True
else:
return False
# test
for line in sys.stdin:
if len(line)>2: # 不对输入的行数进行判断,只对行数后面的日期的输入进行判断
input=line.split()
print(wheather_same_time(input))
3、段誉身具凌波微波,动无常则,若危若安,一次能走一级台阶或者两级台阶,他要爬一段30级的山路,问有多少种走法?分析如何计算,然后编程解答。进阶问题:当他轻功熟练度提升,一次最多可以走三级,那就结果有什么变化?后来走火入魔了,不能走一级,只能走二或三级,又有什么变化?
知识点:动态规划、斐波那契数列
代码:
import sys
def climbStairs_1or2(n):
if n==1:
return 1
elif n==2:
return 2
else:
lst=[0]*(n+1)
lst[1]=1
lst[2]=2
for i in range(3,n+1):
lst[i]=lst[i-1]+lst[i-2]
return lst[n]
def climbStairs_1or2or3(n):
if n==1:
return 1
elif n==2:
return 2
elif n==3:
return 4
else:
lst=[0]*(n+1)
lst[1],lst[2],lst[3]=1,2,4
for i in range(4,n+1):
lst[i]=lst[i-1]+lst[i-1]+lst[i-3]
return lst[n]
def climbStairs_2or3(n):
if n==1:
return 0
elif n==2:
return 1
elif n==3:
return 1
else:
lst=[0]*(n+1)
lst[1],lst[2],lst[3]=0,1,1
for i in range(n+1):
lst[i]=lst[i-2]+lst[i-3]
return lst[n]
for line in sys.stdin:
a = line.split()
a=int(a[0])
print(f'{climbStairs_1or2(a)} {climbStairs_1or2or3(a)} {climbStairs_2or3(a)}')
4、小球自由落体
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?
数据范围: 1≤n≤100
知识点:找规律。
代码:
import sys
# 主代码
def free_fall(n):
if n==1:
hight=50
L=100
return L,hight
hight=50
L=100
for i in range(2,n+1):
hight *= 0.5
L+=hight*4
return L,hight
# 从标准输入读取参数进行测试
if __name__ == "__main__":
for line in sys.stdin:
# 从输入行获取参数
inputs=line.split()
# 将列表的第一个元素转换成整数
n=int(inputs[0])
# 计算
res_L,res_h=free_fall(n)
print(f'{res_L:.6f} {res_h:.6f}')
5、生成n行杨辉三角
知识点:
代码:
class Solution(object):
def generate(self, numRows):
if numRows==1:
return [[1]]
elif numRows==2:
return [[1],[1,1]]
else:
lst=[[1],[1,1]] # 初始化
for i in range(2,numRows): # 从第三行开始遍历出每一行的列表
sub1=lst[-1] # 上一行
sub2=[0]*(i+1) # 当前行
for j in range(i+1): # 遍历索引,算出当前行的所有元素
if j==0 or j ==i:
sub2[0]=sub2[i]=1
else:
sub2[j]=sub1[j]+sub1[j-1]
lst.append(sub2)
return lst