问题描述
一群猴子一共TOTAL只,需要选出一个猴王,于是它们站成一圈,约定从1开始报数,报到NUMBER时就出局一只猴子,接着继续从1开始报数。直到剩下一只猴子的时候,它就是猴王。
输入
TOTAL:猴子总数
NUMBER:出局的报数(报到NUMBER出局)
输出
猴王的编号
思路
可以用链表也可以用数组,这里采用数组。根据TOTAL创建数组,每个元素都置1,循环遍历,并设置计数器模拟报数。报数到NUMBER把当前元素置0,即出局。最重要的一点是,每当出局一个猴子,需要把计数器重置(超出NUMBER需要取余)。当然,遍历数组的计数器也需要注意取余。
解题
def getFinalKing(monkeies):
for item in monkeies:
if item != 0:
return monkeies.index(item)
def getMonkeyKing(total, num):
monkeies = []
for i in range(0, total):
monkeies.append(1)
total_temp = total
count = 1
# 开始报数
# i是当前报数的猴子的下标
i = 0
while total_temp >= 1:
# 只剩最后一个
if total_temp == 1:
# 直接给出答案
print("The king is No." + str(getFinalKing(monkeies)))
return
else:
# 数量大于1的情况
# 找到需要kill的猴子
if count==num and monkeies[i]!=0:
# kill掉, 即置0
monkeies[i] = 0
# 总数-1
total_temp-=1
# 下一个, (必须要找到一个没有kill的猴子)
i += 1
if i >= total:
i = i % total
# 如果已经kill
if monkeies[i] == 0:
while monkeies[i] == 0:
i += 1
if i >= total:
i = i % total
count += 1
if count > num:
count = count % num