【问题标题】:Javascript: Given an array, return a number of arrays with different ordered combinations of elementsJavascript:给定一个数组,返回多个具有不同元素有序组合的数组
【发布时间】:2016-12-21 14:25:03
【问题描述】:

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

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

【问题讨论】:

  • 删除第一个元素,计算其余元素的 permutations 并将第一个元素附加到每个元素。
  • 第二个例子的结果应该是[["a","b","c","d"],["a","c","b","d"],["a","d","c","b"],["a","c","d","b"],["a","d","b","c"],["a","b","d","c"]]吗?
  • 是的......
  • 你想要排列。 .slice(1) 是你的朋友。

标签: javascript arrays shuffle


【解决方案1】:

您可以使用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))

【讨论】:

  • 谢谢!非常有帮助:)
【解决方案2】:

您必须执行.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));

【讨论】:

    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2014-02-09
    • 2015-04-13
    • 2014-12-03
    • 2021-10-04
    相关资源
    最近更新 更多