【问题标题】:JavaScript arrays - Finding the number of combinations of 2 elementsJavaScript 数组 - 查找 2 个元素的组合数
【发布时间】:2015-03-21 02:15:07
【问题描述】:

我来自 Ruby 背景,具有 enumerable 类。在 Ruby 中,我可以很容易地找到数组元素的组合。

array.combination(2).count

我知道 JavaScript 没有这样的内置函数,所以我想知道如何在 JS 中实现它。我在想类似的东西

我有一个数组如下

var numbers = [9,7,12]
var combos = []
for (var i = 0; i < numbers.length; i++)  {
  combos.push([numbers[i], numbers[i+1])
}

顺便说一下,可能的组合是

[9,7], [9,12] and [7,12]

所以通过调用这个数组的长度函数,将返回 3。

有什么想法吗?

【问题讨论】:

  • 顺序重要吗?即:[9,7] 和 [7,9],它们被认为是不同的吗?
  • 我认为这将被视为repeated combination。他们都考虑相同的两个数字,所以它们应该是相同的。我正在寻找不同数字的所有组合

标签: javascript arrays


【解决方案1】:

怎么样:

for (var i = 0; i < numbers.length; i++)
    for (var j = i + 1; j < numbers.length; j++)
        combos.push([numbers[i], numbers[j]]);

【讨论】:

  • 出色的解决方案。看起来这是使用多重递归。谢谢@JuniorCompressor
  • @JoshWinters 这只是一个嵌套的 for 循环。没有递归
  • 对不起,我的意思是多次迭代。
  • @JoshWinters:这是为2 硬编码的。你想实现 Ruby 的combination(),对吧?
  • 你说得对,这只适用于 2。了解 combination(n) 的工作原理很有趣
【解决方案2】:

您是在严格谈论数组的 2 组合还是对 k 组合解决方案感兴趣?

在这个 gist 找到这个

function k_combinations(set, k) {
var i, j, combs, head, tailcombs;

if (k > set.length || k <= 0) {
    return [];
}

if (k == set.length) {
    return [set];
}

if (k == 1) {
    combs = [];
    for (i = 0; i < set.length; i++) {
        combs.push([set[i]]);
    }
    return combs;
}

// Assert {1 < k < set.length}

combs = [];
for (i = 0; i < set.length - k + 1; i++) {
    head = set.slice(i, i+1);
    tailcombs = k_combinations(set.slice(i + 1), k - 1);
    for (j = 0; j < tailcombs.length; j++) {
        combs.push(head.concat(tailcombs[j]));
    }
}
return combs;
}

【讨论】:

  • 这个问题专门针对两个元素的组合。但是谢谢,这也很有用
  • 您可以根据自己的需要进行修改(实际上是使其模块化程度更低,更具体)。
【解决方案3】:

这是一个递归函数,它应该适用于任何数字:

function combination(arr, num) {
  var r= [];

  for(var i = 0 ; i < arr.length ; i++) {
    if(num===1) r.push([arr[i]]);
    else {
      combination(arr.slice(i+1), num-1).forEach(function(val) {
        r.push([].concat(arr[i], val));
      });
    }
  }
  return r;
} //combination

Working Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多