我正在尝试调试下面的代码。
应该创建一个二维数组,其中包含输入字符串的所有排列。
它开始很好,并且初始字符串被推送到数组,但是在我在步骤4中运行反向函数之后,strArr中的值从长度3变为长度2.基本上就像它是在反向函数中跳过concat,但是当我在调试器中运行它时,z在concat之后的长度为3,但是当函数返回时,长度再次变为2。
任何帮助将不胜感激。
function permAlone(str) {
var perms = [];
var totalPerms = factorial(str.length);
var strCodes = converter(str);
var strArr = [];
strArr.push(strCodes);
// overall loop
for (var X = 0; X < totalPerms; X++) {
//step 1
var largestI = -1;
for (var i = 0; i < strCodes.length - 1; i++) {
if (strCodes[i] < strCodes[i + 1]) {
largestI = i;
}
}
//if none found break loop
if (largestI == -1) {
break;
}
//step 2
var largestJ = -1;
for (var j = 0; j < strCodes.length; j++) {
if (strCodes[largestI] < strCodes[j]) {
largestJ = j;
}
}
//step 3
swap(strCodes, largestI, largestJ);
//step 4
strCodes = reverse(strCodes, largestI);
//step 5 push to array
strArr.push(strCodes);
}
console.log(strArr);
return strArr;
}
function factorial(x) {
for (var i = x - 1; i > 0; i--) {
x *= i;
}
return x;
}
function converter(x) {
var temp = [];
for (var i = 0; i < x.length; i++) {
temp.push(x.charCodeAt(i));
}
return temp;
}
function swap(a, i, j) {
var temp = a[i];
a[i] = a[j];
a[j] = temp;
}
function reverse(z, a) {
var endArr = z.splice(a+1);
endArr.reverse();
z = z.concat(endArr);
return z;
}
debugger;
permAlone('abc');
答案 0 :(得分:0)
reverse函数返回一个新数组,不会操作现有数组。您需要将代码更改为以下内容:
endArr = endArr.reverse();
答案 1 :(得分:0)
看起来像是一个浅层副本的问题。
我添加了z = z.slice();反向功能,它解决了问题。