我正在努力获得一个数字的所有组合。例如,输入" 123"应该返回["123", "231", "213", "312", "321", "132"]
。
这是我的功能:
function swapDigits(input) {
for (var i = 0; i++; i < input.length - 1) {
var output = [];
var inter = input.slice(i, i + 1);
var left = (input.slice(0, i) + input.slice(i + 1, input)).split("");
for (var j = 0; j++; j <= left.length) {
var result = left.splice(j, 0, inter).join("");
output.push(result);
}
}
console.log(output);
return output;
}
但是这个函数会返回undefined
,有人能告诉我出了什么问题吗?
答案 0 :(得分:0)
该代码中存在多个错误。
您的for
语句部分的顺序不正确。顺序是初始化,测试,增量。所以for (/* init */ ; /* test */ ; /* increment */)
您正在为外循环的每次迭代创建一个新数组。
我正在将它作为CW,因为我没有检查过上述错误。
答案 1 :(得分:0)
已经提到了for
循环和scope
的错误。除此之外,splice
方法将更改其操作的字符串。这意味着内部循环永远不会终止,因为left
不断增长,因此j
永远不会到达left.length
。
如果您不熟悉某种语言,我建议您从一个与您要实现的算法相近的实现开始。然后,一旦您对它感到满意,请使用更高级的语言结构。
有关示例,请参阅 this fiddle 。这是算法代码:
function getPermutations(input)
{
if(input.length <= 1)
{
return [input];
}
var character = input[0];
var returnArray = [];
var subPermutes = getPermutations(input.slice(1));
debugOutput('Returned array: ' + subPermutes);
for(var subPermuteIndex = 0; subPermuteIndex < subPermutes.length; subPermuteIndex++ )
{
var subPermute = subPermutes[subPermuteIndex];
for(var charIndex = 0; charIndex <= subPermute.length; charIndex++)
{
var pre = subPermute.slice( 0, charIndex );
var post = subPermute.slice( charIndex );
returnArray.push(pre+character+post);
debugOutput(pre + '_' + character + '_' + post );
}
}
return returnArray;
}
基本上,这将走到字符串的末尾并继续构建子字符串的所有排列。最简单的方法是从1234
的调试输出中看到这一点。请注意,“返回的数组”是指由子字符串的排列创建的数组。另请注意,当前字符位于该数组中的每个位置。当前字符显示在_
之间,例如1
中的432_1_
。
Returned array: 4
_3_4
4_3_
Returned array: 34,43
_2_34
3_2_4
34_2_
_2_43
4_2_3
43_2_
Returned array: 234,324,342,243,423,432
_1_234
2_1_34
23_1_4
234_1_
_1_324
3_1_24
32_1_4
324_1_
_1_342
3_1_42
34_1_2
342_1_
_1_243
2_1_43
24_1_3
243_1_
_1_423
4_1_23
42_1_3
423_1_
_1_432
4_1_32
43_1_2
432_1_
此算法不会强制实施唯一性。因此,如果您有一个字符串22
,那么您将得到两个结果 - 22,22
。此外,该算法使用递归,我认为在这种情况下非常直观,但是有纯迭代实现if you look for them。