如何每隔X次删除数组中的项,直到数组长度等于1

时间:2018-08-10 23:14:44

标签: javascript arrays loops

给出具有五个值的数组:

let names = ["Bob", "Brian", "Jen", "Sarah", "Joe"]
let number = 3

我想遍历数组并删除第三个值(使用数字变量,在本示例中为Jen,然后继续向上计数,以便将要删除的下一个项目是Bob。Bob被移除,因为它是Jen之后的第三个值,循环超过数组的长度后从头开始循环。我想继续以这种方式循环直到出现只是数组中剩下的项目。

更直观地讲,每次迭代的结果如下:

  • 鲍勃
  • 布莱恩
  • ~~ Jen ~~
  • 萨拉

  • ~~鲍勃~~
  • 布莱恩
  • ~~ Jen ~~
  • 萨拉

  • ~~鲍勃~~
  • 布莱恩
  • ~~ Jen ~~
  • 萨拉
  • ~~ Joe ~~

  • ~~鲍勃~~
  • ~~ Brian ~~
  • ~~ Jen ~~
  • 萨拉
  • ~~ Joe ~~

2 个答案:

答案 0 :(得分:2)

这是Josephus Problem。我使用来自Rosetta Code的输入测试用例验证了这一点,并通过了该测试用例,但我很想知道它在附加输入上的效果如何,因为它似乎比RC上的所有代码示例都更冗长。

fread(anything, 0,0, anything)

下面是运行RC测试的片段:

let names = ["Bob", "Brian", "Jen", "Sarah", "Joe"];
let number = 3;

for (let n = (number % names.length) - 1; names.length > 1;) {
    names.splice(n, 1);
    n = (n + number - 1) % names.length;
}

console.log(names);

答案 1 :(得分:0)

背景:Flavius Josephus是犹太裔的罗马历史学家。在公元一世纪的犹太罗马战争期间,他与同伴士兵(共41人)一起被困在一个山洞里,周围被敌方罗马军队包围。他们决定自杀,方法是环戴戒指,指望每三个男人自杀。如此指定的每个人都要自杀。 (当计数又回到圆环时,已经自杀的士兵将被跳过计数。)约瑟夫斯(Josephus)不想死,将自己置于第31位,这是最后一个要选择的位置。在问题的一般版本中,有n个士兵,编号从1到n,每第k个士兵将被淘汰。计数从第一个士兵开始。

结果包含将消除元素的数组。您的答案将是最后一个要素。

function josephus(array, count) {
    // Return store
    const store = [];

    // Counter for each time the element should be spliced
    let counter = 0;

    // Array index position
    let index = 0;
    while (array.length > 0) {
        // This is because 'array' is treated like a circular array
        index = index % array.length;
        if (++counter === count) {
            // Remove the element from the array and push onto the store.
            // The first element is used, hence [0]
            store.push(array.splice(index, 1)[0]);

            // Reset the counter
            counter = 0;

            // Move back one index value
            index--;
        }
        index++;
    }

    return store;
}

// Example

console.log(josephus(["Bob", "Brian", "Jen", "Sarah", "Joe"], 3));