给出具有五个值的数组:
let names = ["Bob", "Brian", "Jen", "Sarah", "Joe"]
let number = 3
我想遍历数组并删除第三个值(使用数字变量,在本示例中为Jen
,然后继续向上计数,以便将要删除的下一个项目是Bob
。Bob被移除,因为它是Jen
之后的第三个值,循环超过数组的长度后从头开始循环。我想继续以这种方式循环直到出现只是数组中剩下的项目。
更直观地讲,每次迭代的结果如下:
答案 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));