任何人都可以告诉我为什么这个循环不能正常工作?

时间:2015-05-28 11:33:31

标签: javascript

这是在codewars.com上进行的练习。我们的想法是创建一个函数,它将一个数组作为第一个参数,然后删除第二个参数定义的序列中的每个项目,所以如果第二个参数是3,它将首先删除3(计算这一个应该是是1基础,而不是0基础),然后6,然后9,然后回到2,好像所有项目都在一个圆圈,然后7(因为3和6已经消失)等,然后返回在它们被删除的顺序(这种模式称为约瑟夫斯置换)。

所以这是我的代码:

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。任何人都可以告诉我为什么这样做?如果您有代码交换帐户,可以在其上下文中进行试用:http://www.codewars.com/kata/5550d638a99ddb113e0000a2/train/javascript

2 个答案:

答案 0 :(得分:0)

您的索引重新计算无效。即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;
}

答案 1 :(得分:0)

替换

arr.push(items[a]);

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