列表

详情


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

描述

    每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏是这样的:首先,让 n 个小朋友们围成一个大圈,小朋友们的编号是0~n-1。然后,随机指定一个数 m ,让编号为0的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0... m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客礼品,请你试着想下,哪个小朋友会得到这份礼品呢?

数据范围:
要求:空间复杂度 ,时间复杂度

示例1

输入:

5,3

输出:

3

示例2

输入:

2,3

输出:

1

说明:

有2个小朋友编号为0,1,第一次报数报到3的是0号小朋友,0号小朋友出圈,1号小朋友得到礼物

示例3

输入:

10,17

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-09

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

C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2020-08-13

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

C++ 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-09-23

class Solution {
public:
    int LastRemaining_Solution(int n, int m)
    {
        if(n<1) return -1;
        int last=0;
        for(int i=2;i<=n;i++)
        {
            last=(last+m)%i;
        }
        return last;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-09-08

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

C++ 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-08-28

class Solution {
public:
    /*
    int func(int n, int m){
        if (n == 1) return 0;
        return (m + func(n - 1, m)) % n;  // (m % n + func(n - 1, m)) % n;
    }
    int LastRemaining_Solution(int n, int m)
    {
        if (n < 1 || m < 1) return -1;
        return func(n, m);
    }
    */

    //非递归实现
    /* f(1)=0  f(2)=(m%2 + f(1))%2 */
    int LastRemaining_Solution(int n, int m)
    {
        if (n < 1 || m < 1) return -1;
        int index = 0;    //f(1,m)
        for (int i = 2; i <=n; i ++){
            index = (index + m) % i;
        }
        return index;
    }

};

上一题