添加数组中的所有数字组合

时间:2013-10-09 22:49:38

标签: javascript arrays combinations

我正在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;
}

1 个答案:

答案 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]) );

you can see it here..