【问题标题】:Can anyone tell me why this loop isn't working as it should?谁能告诉我为什么这个循环不能正常工作?
【发布时间】:2015-05-28 11:33:30
【问题描述】:

这是在 codewars.com 上的练习。想法是做一个函数,以数组作为第一个参数,然后按第二个参数定义的顺序删除每个项目,所以如果第二个参数是3,它将首先删除3(计算这个应该是是从 1 开始,而不是从 0 开始),然后是 6,然后是 9,然后回到 2,好像所有的项目都在一个圆圈里,然后是 7(因为 3 和 6 都没有了),等等,然后返回它们被删除的顺序(这种模式称为 Josephus 排列)。

这是我的代码:

function josephus(items, k) {
  var arr = [];
  var l = items.length;
  var a = k - 1;
  for (var i = 0; i < l; i++) {
    arr.push(items[a]);
    items.splice(a, 1);
    a += k - 1 ;
    if (a >= items.length) { a = a - items.length; }
  }
  return arr;
}

它有时会起作用。它适用于josephus([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 1),但随后适用于josephus([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2),它一直有效到最后一个数字(在本例中为5),然后返回null。事实上,大多数情况下,它会在最后一项的位置返回 null。谁能告诉我为什么这样做?如果您有 codewars 帐户,您可以在此处在其上下文中试用:http://www.codewars.com/kata/5550d638a99ddb113e0000a2/train/javascript

【问题讨论】:

  • 这是因为经过几次迭代后,当数组长度小于“k”时,它会返回 undefined,因为我们在缩减数组中的索引上没有元素。

标签: javascript


【解决方案1】:

您的索引重新计算不起作用。即 a = 3,items = [1] a 变为 2,items[2] 未定义。试试这个代码:

function j(items,k){
  var arr = [];
  var l = items.length;
  var a = k - 1;
  for(var i = 0; i<l; i++){
    arr.push(items[a]);
    items.splice(a, 1);
    a += k - 1 ;
    a = a % items.length;
  }
  return arr;
}

【讨论】:

    【解决方案2】:

    替换

    arr.push(items[a]);
    

    arr.push(items[a%items.length]);
    

    【讨论】:

    • 我认为您需要借助上述代码更新代码。它可以正常工作到 3,但没有给出 4 和 5 的预期结果。如果你能解决这个问题,请检查并告诉我。
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    相关资源
    最近更新 更多