圆圈中最后剩下的数

题目描述

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
 
如果没有小朋友,请返回-1
Python 代码
 1 # -*- coding:utf-8 -*-
 2 class Solution:
 3     def LastRemaining_Solution(self, n, m):
 4         # write code here
 5         if n < 1 or m < 1:  # m-1出列
 6             return -1
 7         if n == 1:
 8             return 0
 9         lst = [i for i in range(n)]
10         i = 0
11         while len(lst) > 1:
12             if i + m - 1 < len(lst) - 1:
13                 lst.pop(i+m - 1)
14                 i = i + m - 1
15             elif i + m - 1 == len(lst) - 1:
16                 lst.pop(i + m - 1)
17                 i = 0
18             else:
19 
20                 lst.pop((i + m - 1) % len(lst))
21                 i = (i + m - 1) % (len(lst)+1)
22         return lst[0]

注意点

1.使用一个变量记录删除的索引

2.考虑三种情况,下一个小于列表长度-1,等于列表长度-1,大于列表长度-1

3.第三种情况,先删除元素,长度少了,再赋值时,当前长度要加1,取余计算后,才是删除的元素索引

原文地址:https://www.cnblogs.com/shuangcao/p/12831632.html