【发布时间】:2017-11-04 18:59:08
【问题描述】:
我正在尝试编写一个函数,它接受一个数组,生成所有的两次交换组合,并在每次迭代时将它们添加到一个数组中并返回一个数组数组
我目前的实现:
function localNeighborhood(arr)
{
var returnArray = [];
for(i=0;i<arr.length;i++)
{
for(j=i;j<arr.length-1;j++)
{
var newArr = arr.slice();
var toSwap = newArr[j];
newArr[j] = newArr[j+1];
newArr[j+1] = toSwap;
returnArray.push(newArr);
}
}
return returnArray;
}
localNeighborhood(["1", "2", "3", "4"]);
上面的函数调用应该返回以下变量的数组:
[2,1,3,4] // 1 swap 2
[3,2,1,4] // 1 swap 3
[4,2,3,1] // 1 swap 4
[1,3,2,4] // 2 swap 3
[1,4,3,2] // 2 swap 4
[1,2,4,3] // 3 swap 4
(忽略//注释,我只需要上述数组的一个数组)
但我的代码返回如下
["2", "1", "3", "4"]
["1", "3", "2", "4"]
["1", "2", "4", "3"]
["1", "3", "2", "4"]
["1", "2", "4", "3"]
["1", "2", "4", "3"]
正如您所看到的,实现几乎就在那里,但那里的某个地方出了点问题。我认为嵌套循环及其计数是正确的,因为我们得到了六个结果,但实际的交换出错了。
我想在每次交换时添加到我的“returnArray”。交换是 arr[i] 处的每个变量与 arr[x] 处 x > i 处的每个变量,因此索引 0 将与索引大于 0 的每个变量交换,而最后一个元素仅与最后一个元素交换.
我们将不胜感激。谢谢!
这是我的问题的新版本,因为它被标记为生成排列的副本,但我不想生成数组的排列 - 我不想要 4! = 数组的 24 个排列,我想要变量数组 [i] 交换数组 [x] 的 2-opt 交换,其中 x > i。生成排列是一种简单的方法,但是对于更长的数组需要太多时间并且 Chrome 会崩溃。虽然我的示例是一个包含 4 个元素的数组,但输入数组可能更长。
【问题讨论】:
标签: javascript arrays sorting swap