约瑟夫环的情景问题
- 100个人分别编号1~100
- 循环报数1、2、3 ,报数3的人排出
- 第100号(报数1)结束后,龙摆尾继续报数2、3
- 直至剩余最后一个人,求最后一个人的编号
// sum代表多少个人,score代表报什么数组排除
function ring (sum, score) {
var numbers = [];
for (var i = 1; i <= sum; i++) {
numbers.push(i);
}
var flag = 0;
while (numbers.length > 1) {
l = numbers.length;
for (var j = 0; j < l; j++) {
flag++;
// 为3时,用splice方法从numbers数组中去掉,改变元数组
// 因原数组长度-1,所以索引-1,循环的长度-1
// 当编号为100时,flag = 1,重新开始报数是1的flag为2,解决的龙摆尾报数的问题
if (flag == score) {
flag = 0;
numbers.splice(j, 1);
j--;
l--;
}
}
}
return numbers[0];
};
ring(100, 3) // 91
ring(100, 5) // 47
ring(200, 3) // 128