此变量x
包含需要针对数组进行测试的数字。
var x = 10; var ary = [ 3,5 ]
我想测试x
是否可以通过ary
中任意组合键的总和来计算,然后显示哪些键加起来x
。
在这种情况下,3
无法使用。因此结果将是5, 5
if x = 10
(因为函数应该搜索数组并发现5 + 5等于10)
数组和x的长度未知。我没有使用任何库。这就是我到目前为止的目标:
var x = 10;
var ary = [ 3, 5 ];
function cycle(){
var result;
for( var i = 0; i < ary.length; i++ ){
if( ary[ i ] + ary[ i ] == x ){
result = ary[ i ] + ',' + ary[ i ];
}
else if( ary[ i ] + ary[ i + 1 ] == x ){
result = ary[ i ] + ',' + ary[ i + 1 ];
}
else if( ary[ i + 1 ] + ary[ i + 1 ] == x ){
result = ary[ i + 1 ] + ',' + ary[ i + 1 ];
}
return result;
}
}
var result = cycle();
document.write( result );
&#13;
我知道上面的代码很糟糕,至少不灵活,只适用于我使用它的特定情况。我如何包含所有可能的组合?
假设数组仍然只有2个值3
和5
,下面是更多基于x的结果:
如果x = 8
,结果将= 3, 5
;
如果x = 15
,结果将= 5, 5, 5
如果x = 9
,结果将= 3, 3, 3
等。
注意:对密钥的使用次数没有限制。
答案 0 :(得分:2)
您可以使用乘法。创建一个数组.length
等于输入数组ary
加1
中的最大数,将数组的索引乘以当前数,如果产品等于目标数,则创建一个数组让.length
等于index
并使用当前元素ary
填充数组,否则将返回数组的结果索引设置为输入数字。
const x = [8, 9, 10, 15];
let ary = [3, 5];
let nums = (n, arr) => {
let [keys, res] = [
Array.from(Array(Math.max.apply(Math, arr) + 1).keys()).splice(1)
, Array()
];
for (let prop of arr) {
for (let index of keys) {
if (prop * index <= n) {
if (prop * index === n) {
res.push(Array(index).fill(prop)); break;
}
} else {
res.push(prop); break;
}
}
}
return {x:n, result:res};
}
for (let num of x) console.log(nums(num, ary));
&#13;