题目描述

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

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

示例1

输入

5,3

返回值

3

思路:

本题可以通过设计一个状态数组来实现监控,可以先令数组的值全部为1,定义一个计数值num,只要数组为1就num++,当num=m时,注意这里是m,因为我计数的是个数,而不是索引,我就找到了第一个出列的小朋友,然后我就让计数num重新变为0,开始计数,继续找下一个,在找到n-1个小朋友后,停止,这样最后一个小朋友的数组值为1,其他的都为0,输出下标索引值就可以了,这题有点类似约瑟夫环,还有哈希问题,要巧用数组去做一个状态值,这个状态数组的思路在很多题目中也用的到,这一次的体会更加的深刻了。

class Solution {
public:
    int LastRemaining_Solution(int n, int m) {
        int a[100]={0};
        if(n==0) return -1;
        for(int i = 0;i < n;i++){
            a[i]=1;
        }
        int count = 0,num =0;
        while(count<n-1){
            for(int i=0;i<n;i++){
                if(a[i]==1)
                    num++;
                if(num==m){
                    a[i]=0;
                    count++;
                    num=0;
                }
            }
        }
        int s=0;
        for(int i=0;i<n;i++){
            if(a[i]==1)
                s = i;
        }
        return s;
    }
};