Skip to content

约瑟夫环

  • 这样的场景:一群人围成一圈,从某个人开始报数,报到特定数值的人会被淘汰出圈,然后下一个人重新开始报数,直到只剩下最后一个人为止。
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));

Released under the MIT License.