问题描述:有30个小孩儿,编号从1-30,围成一圈依此报数,1、2、3 数到 3 的小孩儿退出这个圈, 然后下一个小孩 重新报数 1、2、3,问最后剩下的那个小孩儿的编号是多少?
我自己第一次想到的解法,有点小复杂,也没有封装成函数。
var myarr=[];//空数组
for(let i=1;i<=30;i++){
myarr.push(i);//赋值
}
var length=myarr.length;//总长度
var count=-1;//记录报数
var p=-1;//记录下标
while(length!=1)//开始报数
{
count++;
p++;
if(p==myarr.length)p=0;//下标越界
if(count==2){
count=-1;
myarr.splice(p,1);//第一个参数从哪里截,第二个参数截多少个
p--;//被截了一个
length--;
}
}
console.log(myarr);
别人给的答案,还是挺不错的,通过将出去的位置标零,循环结束后,再循环遍历数组,找到那个没有标零的数。
function childNum(num, count){
let allplayer = [];
for(let i = 0; i < num; i++){
allplayer[i] = i + 1;
}
let exitCount = 0; // 离开人数
let counter = 0; // 记录报数
let curIndex = 0; // 当前下标
while(exitCount < num - 1){
if(allplayer[curIndex] !== 0) counter++;
if(counter == count){
allplayer[curIndex] = 0;
counter = 0;
exitCount++;
}
curIndex++;
if(curIndex == num){
curIndex = 0
};
}
for(i = 0; i < num; i++){
if(allplayer[i] !== 0){
return allplayer[i]
}
}
}
childNum(30, 3)