首先简略描述一下问题,编号为 [ 0 , N − 1 ] [0,N-1] [0,N−1]的人围成一圈报数,从编号为 0 0 0的人开始报数 0 0 0,报到 m m m的人出列,然后从出列的下一个人又开始报数 0 0 0,…,一直到所有人都出列为止。
- 问最后一个出列的人的编号,
- 问每次出列的编号的顺序。
【分析】下面我们利用循环数组以及利用定位出列的下标来做。
- 如何定位每次出列的下标:n是每次参与报数的数组的长度,假设每次都从下标0开始报数,则每次的下标都是
(m-1)%n
;那么我们还需要再做一件事,就是将上一局参与过报数的数组放到没有参与报数的数组之后,即nums[i+1:]+nums[:i]
。
def get_mth(nums,m,res):
n=len(nums)
if n==0:
return
if n>0:
i=(m-1)%n
res.append(nums[i])
get_mth(nums[i+1:]+nums[:i],m,res)
m,n=4,9
nums=range(n)
res=[]
get_mth(nums,m,res)
print("the order is ",res)
注:一般地,约瑟夫环是利用循环链表来实现。