Javascript:给定一个数组,返回一些具有不同有序元素组合的数组

时间:2016-12-21 14:25:03

标签: javascript arrays shuffle

我需要采用数组的代码,计算其中的元素数量并返回一组数组,每个数组都显示不同的元素组合。 但是,每个数组的起始元素应该相同。最好用几个例子来解释:

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'应该始终是起始元素。

2 个答案:

答案 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;
&#13;
&#13;

答案 1 :(得分:0)

您必须执行.slice(1)将数组的其余部分提供给排列函数。然后你可以使用.map()将第一个项目粘贴到排列函数结果中每个数组的前面。

如果你将在大型设备上完成这项工作,那么频繁地执行排列功能的重要性。以下使用动态编程方法,据我所知,它是最快的。

&#13;
&#13;
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;
&#13;
&#13;