剑指offer:孩子们的游戏(圆圈中最后剩下的数)(Python)

题目描述

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

解题思路

这道题即“约瑟夫环问题”。思路到位,代码异常简单。我阅读到的觉得不错的解释在这里

代码如下:

def LastRemaining_Solution(self, n, m):
    if n < 1:
        return -1
    res,i = 0, 2
    while i <= n:
        res = (res + m)%i
        i += 1
    return res

或者这个:

def LastRemaining_Solution(self, n, m):
    if n < 1:
        return -1
    if n == 1:
        return 0
    return (self.LastRemaining_Solution(n-1,m)+m)%n

只是以上代码在牛客网那里会提示:

不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为83.33%

测试用例:
4000,997
对应输出应该为:
1027

你的输出为:
maximum recursion depth exceeded

最后,偷偷给出我在不知道什么约瑟夫环的时候的代码~,虽然不美观~

def LastRemaining_Solution(self, n, m):
    if n==0 or m == 0:
        return -1
    kids = list(range(n))
    sp, i = 0, 0
    while len(kids) > 1:
        if i == len(kids):
            i = 0
        if sp == m-1:
            kids.pop(i)
            sp = -1
        else:
            i += 1
        sp += 1
    return kids[0]

猜你喜欢

转载自blog.csdn.net/u010005281/article/details/80100653
今日推荐