约瑟夫环
- 这样的场景:一群人围成一圈,从某个人开始报数,报到特定数值的人会被淘汰出圈,然后下一个人重新开始报数,直到只剩下最后一个人为止。
js
function josephus(n, k) {
let people = Array.from({ length: n }, (v, i) => i + 1);
let index = 0; // 当前指向的人位置
while (people.length > 1) {
// 报数后指向的位置,注意数组索引是从0开始的,所以需要减1
index = (index + k - 1) % people.length;
people.splice(index, 1); // 淘汰掉该位置的人
}
return people[0]; // 返回最后幸存的人
}
// 输出:在41个人按照每数到3淘汰一人的情况下,最后幸存的人编号
console.log(josephus(41, 3));