一、题目描述
喊7 是一个传统的聚会游戏,N个人围成一圈,按顺时针从1-7编号。
编号为1的人从1开始喊数,下一个人喊得数字是上一个人喊得数字+1。
但是当将要喊出数字7的倍数或者含有7的话,不能喊出 而是要喊过。
假定N个人都没有失误。当喊道数字k时,可以统计每个人喊 “过"的次数。
现给定一个长度n的数组,存储打乱的每个人喊”过"的次数,请把它还原成正确顺序,即数组的第i个元素存储编号i的人喊“过“的次数。
输入描述
输入为1行,空格分割的喊过的次数, 注意k并不提供,k不超过200,数字个数为n。
1 2 0 0 0
输出描述
输出为1行,顺序正确的喊过的次数 空格分割。
0 2 0 1 0
二、解题思路
分析:题中没有告诉k(即数到的最后一个数),所以无法从k这个方向入手。从喊过的次数则可以推断出k的大致范围。而参与人数则是索引
思路:
逆着求解,统计喊过的总次数;判断喊过的条件,每次满足条件时,总次数减1,只到总次数为0;然后在满足条件的时候判断是那个索引对应值加1。
三、详细代码
def calculate_pass_order(input_counts):
total_passes = sum(input_counts) # 得到总共多少次过
players = len(input_counts) # 参与人数
pass_counts = [0] * players # 初始化列表
current_num = 1
current_player = 0
while total_passes > 0:
is_multiple_of_7 = current_num % 7 == 0
contains_7 = '7' in str(current_num) # 强制转换类型
if is_multiple_of_7 or contains_7:
pass_counts[current_player] += 1
total_passes -= 1
current_num += 1
current_player = (current_player + 1) % players # 索引从0-6进行循环
return pass_counts
if __name__ == "__main__":
input_counts = list(map(int, input().split()))
result = calculate_pass_order(input_counts)
print(" ".join(map(str, result)))
四、额外补充
print(" ".join(map(str, result)))
最后这行代码没有怎么看懂
原因:因为join是用来连接字符串,而result中元素类型是int型,所以需要用map将元素映射成str类型。