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

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

http://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6

/**

  • 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  • @param n int整型
  • @param m int整型
  • @return int整型
  • C语言声明定义全局变量请加上static,防止重复定义 */
int LastRemaining_Solution(int n, int m ) {
    // write code here
    int i = 1;
    int y = 0;
    
    for (i = 2; i <= n; i++)
    {
        y = (y + m) % i;
    }
    
    return y;
}

解题思路:

举例n = 8, m = 3;计算过程如下: alt

  • 设F(8,3) = y, F(7,3) = x。需找出x与y的对应关系。(注:x,y代表最终留下的元素在本轮的坐标索引号,本例子中为元素G的坐标)

  • 已知,x表示从D字母开始数(x+1)个数后即可得到,最终留下的元素在本轮的坐标索引号。

  • 而从N=8到N=7删除的元素C刚好在D的前一个。我们可知,C在N=8时的坐标为(m-1),因此,(m-1+x+1) 即为G在N = 8时的坐标y。

  • 由于会溢出,所以应对N的值取余。即y = (m-1+x+1)%n;

  • 即F(n,m) = (F(n-1,m) + m) % n;

由上可得:

alt

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务