0

我正在 coderbyte 上解决这个问题......指令是定义一个函数 ArrayAdditionI(arr),它采用 arr 中的数字数组,如果数组中的任何数字组合可以相加等于最大(否则返回 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;
}
4

1 回答 1

0

你也可以用do while循环..下面的方法不是最快的......我假设你只需要知道总和是否等于最大数,你不需要打印出来......就像。 . 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]) );

在这里你可以看到它..

于 2013-10-10T01:48:35.687 回答