【发布时间】: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