如何从JavaScript数组值中找到所有长度的所有排列?

时间:2015-03-22 16:33:21

标签: javascript jquery algorithm

如果我有一个包含项目的数组,例如

["A", "B", "C"]

我想创建一个函数,返回一个包含所有可能排列的数组/所有可能的混合结果,所有大小从1到数组中的项目数

例如结果应该在这里:

["","A" "B", "C","AB", "BA", "AC", "CA", "CB","BC", "ABC", "ACB", "BAC", "BCA", "CAB", "CBA"]

你能帮我吗?

2 个答案:

答案 0 :(得分:2)

我对js并不擅长,但我会尝试向您展示如何解决问题,并会在c++中为您提供与{{1}非常相似的代码}。

首先,您必须知道数组中元素的数量

这是js代码。

js

现在这是主要的想法:

所有可能的排列数,没有重复的元素是var arr=["a","b","c"]; var l=arr.length; ,l是元素的数量。

对于上面的2^l,所有可能排列的数量为arr,也等于2^3=8(111) in binary +1用于空集。

如果从0到7计数,则会有8个元素。如果从二进制计数从(000)到(111),它就是一样的。

计算的结果是:

+1

如果你寻找零和一(你可能会说真或假),他们会在没有重复的情况下显示所有可能排列的数量。(000:选择无元素,001:选择最后一个元素,。 ..,101选择第一个和最后一个元素,...,111:选择所有元素)。 所以现在你可以创建一个生成集合000 001 010 011 100 101 110 111 的函数。

现在,您需要找到具有多个元素的元素的可能混合。我不知道{"","a","b","c","ab","ac","bc","abc"}中的内容是什么,但js我通常使用next_permutation

找到二进制数时,数字的位数必须与数组元素的数量相同。

c++

您现在必须定义向量或动态数组,并且//the code of converting the decimal number to binary. strint tobinary(int l,int n){ int x; string str=""; //the while statement finds the binary equivalent while(n!=0){ x=n/2; n=n%2; str=(x+'0')+str; //the '0' is equal to 48(the ASCII code of 0) } //the while statement adds zeros to the left of the binary number until it's length is equal to the number of the elements. while(str.length()!=l) str="0"+str; return str; } 次找到与字符串2^l中的元素相对的元素。

如果您想在javascript中找到类似排列的内容,see here

我希望我的回答会对你有帮助;

答案 1 :(得分:1)

permute__of_all_size是@M Oehm的功能,运作良好

   function swap(array, i, j) {
    if (i != j) {
        var swap = array[i];
        array[i] = array[j];
        array[j] = swap;
    }
}

function permute_rec(res, str, array) {
    if (array.length == 0) {
        res.push(str);
    } else {
        for (var i = 0; i < array.length; i++) {
            swap(array, 0, i);
            permute_rec(res, str + array[0], array.slice(1));
            swap(array, 0, i);
        }
    }
}

function permute(array) {
    var res = [];

    permute_rec(res, "", array);
    return res;
}

function xpermute_rec(res, sub, array) {
    if (array.length == 0) {
        if (sub.length > 0) permute_rec(res, "", sub);
    } else {
        xpermute_rec(res, sub, array.slice(1));
        xpermute_rec(res, sub.concat(array[0]), array.slice(1));
    }
}

function permute__of_all_size(array) {
    var res = [];

    xpermute_rec(res, [], array);
    return res;
}