我正在coderbyte上解决这个问题......指令是定义一个函数ArrayAdditionI(arr),它接受arr中的数字数组,如果数组中的数字组合可以加起来则返回true等于最大值(否则返回false)。例如,ArrayAdditionI([4,6,23,10,1,3])返回true,因为4 + 6 + 10 + 3 = 23.
我编写了以下函数,它似乎有效,但我认为它并不像我希望的那样简洁。我想知道是否有一种方法可以让它变得更短更甜,而不会涉及JavaScript的任何复杂方面,即只使用循环和添加,就像我在这里做的那样。欢迎提出任何建议......
function ArrayAdditionI(arr) {
// let's find the largest number
var i,
j,
k,
largest,
result,
length = arr.length - 1,
sorted = [];
sorted = arr.sort(function(a,b) {return a - b});
largest = sorted.pop();
for (i = 0; i < length; i += 1) {
result = sorted[i];
if (result === largest) {
return true;
}
for (j = i + 1; j < length; j += 1) {
result = sorted[i] + sorted[j];
if (result === largest) {
return true;
}
for (k = j + 1; k < length; k += 1) {
result = sorted[i] + sorted[j] + sorted[k];
if (result === largest) {
return true;
}
}
}
}
return false;
}
答案 0 :(得分:0)
你可以循环使用do而且..下面的方法并不是最快的......我假设你只需要知道总和是否等于最大数量而你不需要打印出来..喜欢...... 4 + 6 + 10 + 3 = 23.
function ArrayAdditionI(arr) {
arr = arr.sort(function(a,b) {return a - b;});
// the largest number in the array..
var largest = Math.max.apply(Math, arr);
// a helper function to find the sum of an aray..
var arrSum = function(array) {return array.reduce(function(a, b) {return a + b;}); };
// creating subArrays..
var subArrs = [], subArr, mask, total = Math.pow(2, arr.length);
for(mask = 0;mask<total; mask++){
subArr = [] ;
i = arr.length - 1 ;
do{
if( (mask & (1 << i)) !== 0) {
subArr.push(arr[i]) ; }
}
while(i--);
// since we only need the sum
if( subArr.length >= 2){
if(arrSum(subArr) > largest) {
break;
}
subArrs.push(arrSum(subArr)); }
}
// remove dupes..
subArrs = subArrs.filter(function(array, pos) {
return subArrs.indexOf(array) == pos;}) ;
console.log("Largest : " + largest);
console.log( subArrs);
// search if largest number exsists in the array...
for(var l in subArrs) {
if ( subArrs[+l] == largest) {
return true ;
}
}
return false;
}
console.log(ArrayAdditionI([4,6,23,10,1,3]) );