我有一组数字;例如:[12, 13, 15, 18]
。我必须从中查找其总和是特定的“总值”的元素,例如:25为12 + 13。
编辑:首先感谢大家的宝贵反馈,但我想你们中的许多人都误解了我的问题!我的问题不仅是“两个结合”,而且是两个以上。例如:
1 2 3 4 5 6 7 8 9 10 100
从上面的列表中,我们需要获得“ 119”,这里我们需要的不仅仅是“两个组合”。
如何通过bash脚本或JavaScript编写代码?
请帮助。
答案 0 :(得分:4)
您可以采取递归方法,并使用短路检查总和是否大于给定总和的每种组合。
function getSum(numbers, sum) {
function iter(index, right, left) {
if (!left) return result.push(right);
if (left < 0 || index >= numbers.length) return;
iter(index + 1, [...right, numbers[index]], left - numbers[index]);
iter(index + 1, right, left);
}
var result = [];
iter(0, [], sum);
return result;
}
getSum([12, 13, 15, 18], 25).forEach(a => console.log(...a));
console.log('--')
getSum([1, 2, 3, 4, 5], 10).forEach(a => console.log(...a));
答案 1 :(得分:0)
您可以使用indexOf方法做一些简单的事情。
function findComb(arr, sum) {
for (let i = 0; i < arr.length - 1; i++) {
let j = arr.indexOf(sum - arr[i], i);
if (j !== -1) {
return [arr[i], arr[j]]
}
}
}
console.log(findComb([12, 13, 15, 18], 25))
注意: :将仅返回第一个组合,并且限制为2个数字。
答案 2 :(得分:0)
let orgArr=[12,13,14,11,15,18];
orgArr.filter((each,i,orgArr)=>orgArr[i+1]!==undefined?each+orgArr[i+1]===25?console.log(each,"..",orgArr[i+1]):"":"")
它将为您提供总和为25的货币对
答案 3 :(得分:0)
bash版本:
#!/usr/bin/env bash
function find_sum {
local sum=$1 first=$2; shift 2
while test $# -gt 0; do
for c; do
if test $sum = $(($first + $c)); then
echo $sum = $first + $c
fi
done
first=$1; shift
done
}
find_sum 25 15 12 13 18
答案 4 :(得分:0)
这是背包问题的一种变体,请尝试通过Google搜索。您可以在2 ^ n中或在n ^ 2中使用二维数组来存储部分结果的方法来递归地找到解决方案。
答案 5 :(得分:0)
function findComb(total, arr) {
const output = new Set([]);
arr.forEach((el, index) => {
const i = arr.indexOf(total - el, index);
if(i > -1) { output.add(el); output.add(arr[i]); }
});
return [...output];
}
console.log(findComb(25, [12, 13, 15, 18]));
console.log(findComb(25, [12, 13, 7, 15, 18, 12]));