【问题标题】:I need to remove items from array until there is only one我需要从数组中删除项目,直到只有一个
【发布时间】:2017-11-23 21:46:53
【问题描述】:

我已经制作了数组,但我只需要从列表中清除每隔一个项目并执行该工作直到只剩下 1 个项目的函数,例如我需要在 1-10 的数组中做一些事情,包括 1 和 10结果需要为 5?

任何类似这样的建议,但只需要 javascript 而不是 python How to delete elements of a circular list until there is only one element left using python?

我在 html body 标签中使用这个

var num = prompt("type num"); 
var array = []; 
for (i = 1; i <= num; i++) {  
  array.push(i);   
}  
document.write(array + "<br>");

到目前为止我已经尝试过了,但这并不能很好地完成工作

    while (i--) {
  (i + 1) % 2 === 0 && array.splice(i, 1)
}

它只在第一次删除并保留数组 1 3 5 7 9 在这种情况下我需要它只有 5,因为在我的情况下提示是 10

【问题讨论】:

  • 发布一些示例和您尝试过的代码。在投票者到来之前。
  • 在 html 正文标签中使用 this
  • 我试过 while (i--) { (i + 1) % 2 === 0 && array.splice(i, 1) } 但它只做一次工作,每秒离开一次包括一个 1 3 5 7 9 不重复怎么办?
  • 请更新问题,而不是将未格式化的代码粘贴到 cmets。你的 document.write 带有非法的&lt;/br&gt; 标签看起来很奇怪
  • 抱歉更新了现在检查我的错误
    标签对我来说没有问题,如果我错了,请随时更正

标签: javascript arrays


【解决方案1】:

圆形部分使它非常棘手。您的循环条件应该是数组长度> 1,并且在循环中,一旦计数器超过数组的长度 - 2,您就必须手动弄乱计数器。如果它等于 arr.length,则要跳过第一个元素下次数组,否则从第一个元素开始。对不起,我没有更好地解释它,这是代码。

var arr = [1,2,3,4,5,6,7,8,9,10];
var i = 1;

while (arr.length > 1) {
  console.log("removing " + arr[i]);
  arr.splice(i, 1);
 
  var left = arr.length - i;
  if (left == 0)
    i = 1;
  else if (left == 1)
    i = 0;
  else
    i++;
}
  
console.log("result " + arr[0]);

编辑 - 这几乎完全是 The Josephus Problem 或查看来自 Numberphile on Youtube 的剧集

有一个简短的递归方法来解决它。参数n 是最大的数字(类似于从 1 到 n 的 n 个数字的数组),k 是一次要跳过的位置数(每隔一个为 2)。

var josephus = (n, k) => {
  if (n == 1) return 1;
  return (josephus(n - 1, k) + k-1) % n + 1;
};
console.log(josephus(10, 2));

【讨论】:

  • 代码运行良好,再次感谢我正在寻找的东西:D
【解决方案2】:
while(array.length > 1) {
    array = array.filter((_, index) => index % 2 === 0);
}

基本上,只要长度大于 1,就删除每个第二个索引。filter 的回调允许值作为第一个参数,索引作为第二个参数,根据 MDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多