题目描述
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。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,取余计算后,才是删除的元素索引