美文网首页
4.孩子们的游戏(圆圈中最后剩下的数)

4.孩子们的游戏(圆圈中最后剩下的数)

作者: 你好宝宝 | 来源:发表于2020-03-12 19:17 被阅读0次

题目描述

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。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]

相关文章

网友评论

      本文标题:4.孩子们的游戏(圆圈中最后剩下的数)

      本文链接:https://www.haomeiwen.com/subject/qehijhtx.html