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

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

题目:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

如果没有小朋友,请返回-1
思路:

 

 func LastRemaining_Solution(n, m int) int {
    if(n < 1 || m < 0){
        return -1;
    }
    res := 0
    for i := 2;i <= n;i++ {
        res = (res + m) % i
    }
    return res
}

 

func LastRemaining_Solution( n int ,  m int ) int {
    // write code here
    k, j := 0, 0 //k=出圈的小孩数,j=报数编号
    nums := make(map[int]int)
    for i := 0; i < n; i++ {
        nums[i] = 0
    }

    for i := 0; k != n - 1; i = ((i + 1) % n){//i=(++i) % n这里是一个特殊操作,使遍历自动再数组内循环

        if nums[i] == 0 {
            j++
            if j == m {
                nums[i] = 1
                j = 0
                k++
            }//此位置小孩退圈
        } 
    }

    for k, v := range nums {
        if v == 0 {
            return k
        }
    }

    return -1
}

  

 

posted @ 2021-04-10 18:42  zqlucky  阅读(54)  评论(0编辑  收藏  举报