javascript返回一个数字的所有组合

时间:2014-03-10 02:05:00

标签: javascript

我正在努力获得一个数字的所有组合。例如,输入" 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,有人能告诉我出了什么问题吗?

2 个答案:

答案 0 :(得分:0)

该代码中存在多个错误。

  1. 您的for语句部分的顺序不正确。顺序是初始化测试增量。所以for (/* init */ ; /* test */ ; /* increment */)

  2. 您正在为外循环的每次迭代创建一个新数组。

  3. 我正在将它作为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