我需要采用数组的代码,计算其中的元素数量并返回一组数组,每个数组都显示不同的元素组合。 但是,每个数组的起始元素应该相同。最好用几个例子来解释:
var OriginalArray = ['a','b','c']
应该返回
results: [['a','b','c'], ['a','c','b']]
或者例如:
var originalArray = ['a','b','c','d']
应该返回
[['a','b','c','d'], ['a','b','d', 'c'], ['acbd', 'acdb', 'adbc', 'adcb']]
再次注意起始元素,在这种情况下'a'应该始终是起始元素。
答案 0 :(得分:0)
只有当第一个元素等于原始数组的第一个元素时,才可以使用Heap's algorithm进行排列并稍微修改它以添加到结果中。
var arr = ['a', 'b', 'c', 'd']
function generate(data) {
var r = [];
var first = data[0];
function swap(x, y) {
var tmp = data[x];
data[x] = data[y];
data[y] = tmp;
}
function permute(n) {
if (n == 1 && data[0] == first) r.push([].concat(data));
else {
for (var i = 0; i < n; i++) {
permute(n - 1);
swap(n % 2 ? 0 : i, n - 1);
}
}
}
permute(data.length);
return r;
}
console.log(generate(arr))
&#13;
答案 1 :(得分:0)
您必须执行.slice(1)
将数组的其余部分提供给排列函数。然后你可以使用.map()
将第一个项目粘贴到排列函数结果中每个数组的前面。
如果你将在大型设备上完成这项工作,那么频繁地执行排列功能的重要性。以下使用动态编程方法,据我所知,它是最快的。
function perm(a){
var r = [[a[0]]],
t = [],
s = [];
if (a.length <= 1) return a;
for (var i = 1, la = a.length; i < la; i++){
for (var j = 0, lr = r.length; j < lr; j++){
r[j].push(a[i]);
t.push(r[j]);
for(var k = 1, lrj = r[j].length; k < lrj; k++){
for (var l = 0; l < lrj; l++) s[l] = r[j][(k+l)%lrj];
t[t.length] = s;
s = [];
}
}
r = t;
t = [];
}
return r;
}
var arr = ['a','b','c','d'],
result = perm(arr.slice(1)).map(e => [arr[0]].concat(e));
console.log(JSON.stringify(result));
&#13;