我在这个特殊问题上有困难。
我被要求找到一个严格比输入数组少一个元素的组合子集。例如来自数组:
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]);
}
}
有没有办法做到这一点?预先感谢。
答案 0 :(得分:7)
由于只为每个结果删除一个元素,因此原始列表中的每个元素都会有一个结果。您可以只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]))
答案 1 :(得分:4)
您可以采用一个生成器,并且仅采用一个元素或结果。
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; }
答案 2 :(得分:2)
您可以执行以下操作:
环绕数组并每次删除一个
// 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)