十五个猴子围成一圈选大王,依次1-7 循环报数,报到7 的猴子被淘汰,直到最后一只猴子成为大王。问,哪只猴子最后能成为大王?
老师留的作业,ArrayList写的....,报到7的猴子remove掉,但要注意如果是末尾的猴子被淘汰,要从头开始重新循环,否则报数的猴子的索引不变。
package com.oracle.test4;
import java.util.ArrayList;
public class MonkeyKing {
public int selectKing(ArrayList list){
int k=0;//报数的猴子的索引
int count=1;// 报的数
//当猴子有两只或两只以上时时
while(list.size()>1){
//报到7的猴子出局
if(count%7==0){
System.out.println("第"+(Integer)list.get(k)+"只猴子出局");
list.remove(k);
if(k>list.size()-1) k=0; //出局的是末尾的猴子,从头开始
count=1;
}else{
count++;
if(k<list.size()-1) k++;
else k=0; //报到了末尾的那只猴子,从头开始
}
}
return (Integer)list.get(0);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList mylist=new ArrayList();
for(int i=1;i<=15;i++)
mylist.add(i);
MonkeyKing mk=new MonkeyKing();
System.out.println("大王是第"+mk.selectKing(mylist)+"只猴子");
}
}
牛客网的题,和上面的差不多。
题目描述
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
如果没有小朋友,请返回-1
import java.util.*;
public class Solution {
public int LastRemaining_Solution(int n, int m) {
int[] children = new int[n]; //表示孩子的数组
int k = n; //当前还剩几个孩子
int index = 0; //当前报数的孩子
int count = 0; //从0开始报数
while(k>1){
if(count%m==m-1 && children[index]!=-1){ //这个小朋友未被淘汰,且报数为m-1,淘汰他
children[index] = -1; //用-1表示这个小小孩已经被淘汰
//继续下一个人,如果到数组最后需要从0重新开始。否则index++即可
if(index==n-1){
index = 0;
}else{
index++;
}
count++; //继续报下一个数
k--; //剩余人数减一;
}else if(children[index]==-1){ //这个小朋友已经被淘汰了
if(index==n-1){
index = 0;
}else{
index++;
}
}else{ //这个小朋友未被淘汰,但是报数不是m-1
if(index==n-1){
index = 0;
}else{
index++;
}
count++;
}
}
//找到没被淘汰的唯一小朋友
for(int i=0;i<n;i++){
if(children[i]!=-1){
return i;
}
}
return -1;
}
}