【问题标题】:How find all permutations with all length from JavaScript array values?如何从 JavaScript 数组值中找到所有长度的所有排列?
【发布时间】:2015-03-22 16:33:20
【问题描述】:

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

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

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

例如结果应该在这里:

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

你能帮帮我吗?

【问题讨论】:

  • 你尝试了什么?我们不应该为你开发东西。你需要先尝试一下,当你的代码不起作用时寻求帮助。
  • 这是一个非常简单但不是很优雅的解决方案,您应该能够不费吹灰之力地弄清楚自己 -> jsfiddle.net/her8z7rs
  • @Jeremy Thille:你是对的,但也许排列它是一个经典的算法,他有一个名字,有人给我一个我没有找到的链接或给我要点,因为这对我没有用重新编码轮。如果人们问它什么时候非常非常难,这个网站真的没那么有用了
  • 非常好的答案在这里:stackoverflow.com/questions/29195881/…
  • @VivienPipo:请编辑您的问题,而不是重新发布它们。

标签: javascript jquery algorithm


【解决方案1】:

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

首先要知道数组的元素个数

这是js 代码。

var arr=["a","b","c"];     
var l=arr.length;

现在是主要思想:

没有重复元素的所有可能排列的数量是2^l,l是元素的数量。

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

如果你从 0 数到 7,你将有 8 个元素。如果用二进制数从 (000) 到 (111) 也是一样。

计数的结果是:

000
001
010
011
100
101
110
111

如果您寻找零和一(您可能会说真或假),它们将显示所有可能排列的数量而没有重复。(000:选择没有元素,001:选择最后一个元素,。 ..,101选择第一个和最后一个元素,...,111:选择所有元素)。 所以现在你可以创建一个函数来生成集合{"","a","b","c","ab","ac","bc","abc"}

现在,您需要找到包含多个元素的元素的可能组合。我不知道js 里面是什么,但是c++ 我通常使用next_permutation

求二进制数时,位数必须与数组元素个数相同。

//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 次中找到与字符串str 中的元素相反的元素。

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

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

【讨论】:

    【解决方案2】:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2012-03-04
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多