这是在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
答案 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]);