2013-10-09 6 views
0

Я решаю эту проблему на 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

Рассмотрим размещение в http://codereview.stackexchange.com – user2736012

ответ

0

вы можете цикл с делать в то же время .. ниже метод IsNot самый быстрый ... и я предполагаю, что вы только должны знать, если сумма будет равна наибольшему числу и вам не нужно распечатать ... как .. 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..

Смежные вопросы