每年六一儿童节,NowCoder都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为NowCoder的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为1的小朋友开始报数。每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续1...m报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到NowCoder名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?
这就是传说的猴子报数的算法么?
public static void main(String[] args) {
int n, m;
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
int result = LastRemaining_Solution(n, m);
System.out.println(result );
}
public static int LastRemaining_Solution(int n, int m) {
Boolean flag[] = new Boolean[n];
int i, j, num = n, index = 0, countNum = 0;
for (i = 0; i < n; i++) {
flag[i] = true;
}
while (num > 1) {
if(flag[index] == false){
while (flag[index] == false) {
index++;
if (index == n)
index = 0;
}
}
countNum++;
if(countNum == m){
flag[index] = false;
countNum = 0;
num--;
}
index++;
if (index == n)
index = 0;
}
for (i = 0; i < n; i++) {
if (flag[i] == true)
return i+1;//表示从一到n的站队序号中最后剩下的人的序号
}
return -1;
}
以上是自己写的代码,但是看过大神的代码后,受到了深深的打击,人家几行就写出来了,关键代码如下:
public static int LastRemaining_Solution(int n, int m) {
if(n<1 || m<1)
return -1;
int num=0;
for(int j=2;j<=n;j++)
num=(num+m)%j;
return num;
}
这就是传说的猴子报数的算法么?
但是这位大神的代码只能得出最后剩下的是谁,我的代码能得出被淘汰的顺序以及剩下的是谁功能强大了那么一点点