如果我有一个包含项目的数组,例如
["A", "B", "C"]
我想创建一个函数,返回一个包含所有可能排列的数组/所有可能的混合结果,所有大小从1到数组中的项目数
例如结果应该在这里:
["","A" "B", "C","AB", "BA", "AC", "CA", "CB","BC", "ABC", "ACB", "BAC", "BCA", "CAB", "CBA"]
你能帮我吗?
答案 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;
}