【问题标题】:Find Subset Combination in an Array在数组中查找子集组合
【发布时间】:2019-04-06 18:35:52
【问题描述】:

我在这个特殊问题上遇到了困难。

我被要求找到一个比输入数组严格少一个元素的组合子集。例如来自数组:

var num = [1,2,3,4,5]

找出这些组合:

[1,2,3,4]
[2,3,4,5]
[1,2,4,5]
[1,2,3,5]
[1,3,4,5]

从这个数组中:

var num = [2,4,6]

找出这些组合:

[2,4]
[2,6]
[4,6]

我已经尝试过这段代码,但它不是动态的,因为我必须打印数组的每个索引:

var num = [1,2,3,4,5];
var n = num.length;
var i, j;

for(i = 0; i < n; i++){
    for(j = i + 1; j < n; j++){
        console.log(num[i] + ", " +  num[j]);
    }
}

有没有办法做到这一点?提前致谢。

【问题讨论】:

  • 你的问题没有明确定义,你的意思是找到所有的子集严格来说比输入数组少一个元素吗?
  • 数组中是否有重复项,如果有,应如何处理?
  • @UriGoren 是的,谢谢指正,我已经修改了问题
  • @ScottSauyet 是的,第一组包含 [2,3,4,5],已在问题中列出
  • @MarkSchultheiss 唯一组合仅限于数组中的特定索引。就此而言,该值可能是重复的。

标签: javascript arrays combinations


【解决方案1】:

由于您只是为每个结果删除一个元素,因此原始列表中的每个元素都会有一个结果。你可以map()slice()

const remove = (num) => num.map((_, i, arr) => [...arr.slice(0, i), ...arr.slice(i+1)])

console.log(remove([1,2,3,4,5]))
console.log(remove([2, 4, 6]))

【讨论】:

  • 如果有一个包含五个元素的数组和一个包含三个元素的结果集呢?
  • @NinaScholz - 这不适合具体说的问题,“子集严格来说比输入数组少一个元素。”
  • @NinaScholz -- 是的,标题有点误导。
  • @MarkMeyer 我为线程标题的歧义道歉,已经编辑过了。希望对您有所帮助。也感谢您的解决方案。
【解决方案2】:

您可以使用一个生成器并只获取一个元素或结果。

function* getCombinations(array, length, left = []) {
    var i = 0;
    if (!length) yield left;
    while (i < array.length) {
        yield* getCombinations(array.slice(i + 1), length - 1, [...left, array[i]]);
        i++;
    }
}

console.log([...getCombinations([1, 2, 3, 4, 5], 4)].map(a => a.join(' ')));
console.log([...getCombinations([2, 4, 6], 2)].map(a => a.join(' ')));
console.log([...getCombinations([1, 2, 3, 4, 5], 3)].map(a => a.join(' ')));  // not asked
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果只删除一个元素,您可以过滤数组。

function* getCombinations(array) {
    var l = array.length;
    while (l--) yield array.filter((_, i) => i !== l);
}

console.log([...getCombinations([1, 2, 3, 4, 5], 4)].map(a => a.join(' ')));
console.log([...getCombinations([2, 4, 6], 2)].map(a => a.join(' ')));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案3】:

    您可以执行以下操作:

    循环数组,每次删除一个

    // Function to return an array except the given one
    Array.prototype.except = function(val) {
        return this.filter(function(x) { return x !== val; });        
    }; 
    
    
    // For array of 5
    var array1 = [1,2,3,4,5]
    var result1 = []
    
    array1.forEach(function(val){
      result1.push(array1.except(val))
    });
    
    console.log('For Array of 5')
    console.log(result1)
    
    
    // For array of 3
    
    var num = [2,4,6]
    var num_result = []
    num.forEach(function(val){
      num_result.push(num.except(val))
    });
    console.log('For Array of 3')
    console.log(num_result)

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多