我正在尝试使用堆算法为给定字符串创建一个包含所有排列的数组。当我使用 console.log 进行测试时,该函数会打印正确的数组结果。但是,当我尝试将所有数组插入新数组时,它每次都会插入相同的初始数组。
在此示例中,它推送 [a, a, b] 6 次。
首先,为什么要这样做?其次,我如何绕过它并将所有正确的结果推送到我的新数组中。
function permAlone(str) {
//make str into array
var arr = str.split('');
var allArrays = [];
//Heap's Algorithm to make new array with all permutations
var swap = function (array, pos1, pos2) {
var temp = array[pos1];
array[pos1] = array[pos2];
array[pos2] = temp;
};
var permute = function(array, n) {
n = n || array.length;
if (n === 1 ) {
console.log(array);
//allArrays.push(array);
}
else {
for (var i=1; i <= n; i += 1) {
permute(array, n-1);
if (n%2) {
var j=1;
}
else {
j=i;
}
swap(array, j-1, n-1);
}
}
};
permute(arr);
//console.log(allArrays);
}
permAlone('aab');
最佳答案
您只有一个数组(不包括 allArrays
),因此您已将同一个数组插入 allArrays
六次。
在推送数组之前,您应该复制该数组。您可以使用 slice 来做到这一点:
allArrays.push(array.slice(0));
关于javascript - 对于 JavaScript 中的堆算法,array.push 产生的结果与 console.log 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40496835/