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 }