题目描述
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
如果没有小朋友,请返回-1
代码:
(1)循环链表
# -*- coding:utf-8 -*-
class child:
def __init__(self,val):
self.val=val
self.next=None
class Solution:
def LastRemaining_Solution(self, n, m):
if n<=1: # 如果输入小于等于1,则不存在
return -1
head=child(0)
cur=head
for child_id in range(1,n-1): #构建循环链表
cur.next=child(child_id)
cur=cur.next
end_node=child(n-1)
cur.next=end_node
end_node.next=head
cur=head
while(cur!=cur.next): #每次报数,删去一个节点,当循环链表只剩一个节点,则返回
for i in range(m-1):
pre=cur
cur=cur.next
pre.next=cur.next
cur=cur.next
return cur.val
(2)在列表中计算报数的最后一个同学
class Solution:
def LastRemaining_Solution(self, n, m):
# write code here
if n<=1:
return -1
start=0 #记录从哪个孩子开始报数
childs=list(range(n))
while(len(childs)>1):
cur=(m%len(childs)+start-1)%len(childs)
del childs[cur]
start =cur #因为上面一行已经删去了当前节点,所以下一个节点在新列表中的索引等于上一个节点的索引
return childs[0]
网友评论