约瑟夫环

首先简略描述一下问题,编号为 [ 0 , N − 1 ] [0,N-1] [0,N1]的人围成一圈报数,从编号为 0 0 0的人开始报数 0 0 0,报到 m m m的人出列,然后从出列的下一个人又开始报数 0 0 0,…,一直到所有人都出列为止。

  1. 问最后一个出列的人的编号,
  2. 问每次出列的编号的顺序。

【分析】下面我们利用循环数组以及利用定位出列的下标来做。

  • 如何定位每次出列的下标: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)

注:一般地,约瑟夫环是利用循环链表来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值