【问题标题】:subsets of an arrays with n elements javascript具有n个元素的数组的子集javascript
【发布时间】:2014-07-03 14:46:38
【问题描述】:

我正在尝试编写一个将数组和 n 作为参数的函数,

它将返回该数组的所有包含 n 个元素的子集,已经尝试了几件事,但仍未成功。

感谢把它放在这里的人,这个函数太复杂了,不能完成这项工作,基本上我在这里尝试做的是从一个 4 元素数组中挑选一个元素来创建它的 3 个元素子集。它甚至不以 N 作为参数。它返回所有 3 个元素子集,但也返回相同的子集,所以我也必须将它们过滤掉,无论如何我会继续尝试。

function findSubsets(array) { 
    var answers = []; 
    var firstArray = array; 
    for (i = 0; i < array.length; i++) { 
       array = firstArray; 
       for (var k = 0; k < array.length; k++) { 
          if (k != i) { 
              var subset = array.splice(k, 1); 
              answers.push(array); array.splice(k, 0, subset[0]);
          } 
       }
    } 
}

【问题讨论】:

  • 向我们展示您的尝试,我们将帮助您修复它并了解它为什么不起作用。
  • 这甚至没有将 N 作为参数,它只是实验:我仍在尝试 function findSubsets(array) { var answers = []; var firstArray = 数组; for (i = 0; i
  • 编辑您的帖子并将您尝试过的内容放在那里。它没有在 cmets 中格式化,难以阅读。
  • @RiverTam,该链接非常有帮助并且与此问题相关,感谢您找到它。使用该函数的结果,然后对其进行过滤,以便仅保留长度为 N 的子集。

标签: javascript arrays


【解决方案1】:

这并不像看起来那么复杂。这个是优化的,因为它不会在这个过程中创建无用的临时数组。

function findSubsets(array, n) { 
    var answers = []; 
    for(var i = 0 ; i < array.length ; i += n) {
        answers.push(array.slice(i, i + n));
    }
    return answers;
}

findSubsets([1, 2, 3, 4, 5, 6, 7, 8, 9], 2) // --> [[1, 2], [3, 4], [5, 6], [7, 8], [9]]
findSubsets([1, 2, 3, 4, 5, 6, 7, 8, 9], 3) // --> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

【讨论】:

  • 谢谢,但是这个并没有返回所有子集,所以没有 [1,3],[1,5],我看到了一个使用位运算符的解决方案,
【解决方案2】:

你可以试试这个解决方案

var subsetArray = (function() {
  return {
    getResult: getResult
  }

  function getResult(array, n) {

    function isBigEnough(value) {
      return value.length === n;
    }

    var ps = [
      []
    ];
    for (var i = 0; i < array.length; i++) {
      for (var j = 0, len = ps.length; j < len; j++) {
        ps.push(ps[j].concat(array[i]));
      }
    }
    return ps.filter(isBigEnough);
  }
})();

var arr = [1, 2, 3, 4,5,6,7,8,9]; console.log(subsetArray.getResult(arr,2));

【讨论】:

  • 只有在元素很简单的情况下才有效。不适用于数组数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
相关资源
最近更新 更多