2016-06-11 15 views
-3

ArrayAdditionI (arr) nimm das Array von in arr gespeicherten Zahlen und // trage zurück, wenn eine beliebige Kombination von Zahlen im Array // hinzugefügt werden kann, um der größten Zahl im Array zu entsprechen // Zeichenfolge falsch. Beispiel: Wenn arr [4, 6, 23, 10, 1, 3] enthält, sollte der // -Ausgabewert true sein, weil 4 + 6 + 10 + 3 = 23 ist. Das Array // ist nicht leer, enthält nicht alle die gleichen Elemente und können // negative Zahlen enthalten. // Beispiel Testfälle // Eingabe: 5,7,16,1,2 // Ausgabe: "false" // // Eingabe: 3,5, -1,8,12 // Ausgabe : „true“Warum gibt forEach-Funktion falsche Ausgabe?

function findLargest(array){ 
     var largest = array[0]; 

     array.forEach(function(num){ 
     if(num > largest){ 
      largest = num; 
     } 
     }); 
     return largest; 
    } 

    function ArrayAdditionI(array){ 
     var largest = findLargest(array); 
     var index = array.indexOf(largest); 
     array.splice(index,1); 

     array.forEach(function(num,idx){ 
     var sum = 0; 
     for(var j=0; j<array.length; j++){ 
      if(num === array[j]){ 
      continue; 
      }else{ 
      sum+=array[j]; 
      } 
     } 
     if(sum === largest){ 
      return true; 
     } 
     }); 
    return false; 
    } 

    console.log(ArrayAdditionI([4, 6, 23, 10, 1, 3])); 

Hallo an alle !!, der Ausgang dieser ArrayAdditionI Funktion wahr sein sollte, aber aus irgendeinem unbekannten Grund es false.However zurückkehrt, fand ich heraus, dass es wegen der forEach Funktion ist, weil als ich forLoop benutzt habe, hat es gut funktioniert. Weiß jemand warum, wenn ich forEach benutze, gibt es mir eine falsche Ausgabe? und warum passiert das?

+0

if (sum === large) {return true;} sonst return false – user3791775

+2

'return' aus' forEach' wird nicht von der 'ArrayAdditionI' Funktion zurückgegeben, sondern nur von der' forEach' Funktion selbst – Hamms

+1

' Funktion findLargest (Array) {return Math.max.apply (null, Array); } ' – MT0

Antwort

1

Mein Ziel ist es zu wissen, dass, wenn eine Summe der Array-Elemente gleich der größten Anzahl im Array sind.

Sie können es mit tun:

function containsSumToMaximum(array){ 
    array.sort(function(a,b){ return a < b ? -1 : 1; }); 
    var max = array.pop(); 
    for (var i = 3; i < 2 << array.length; i++) 
    { 
    var sum = 0, 
     count = 0; 
    for (var j = 0; j < array.length; j++) 
    { 
     if (i & (2 << j)) 
     { 
     sum += array[j]; 
     count++; 
     } 
     if (sum > max) 
     break; 
    } 
    if (sum == max && count > 1) 
     return true; 
    } 
    return false; 
} 

Für eine Reihe n Elemente gibt es 2^n -1 Möglichkeiten der Addition ein oder-mehrere dieser Elemente. Der obige Algorithmus führt nur eine Brute-Force-Suche all dieser möglichen Summen durch und berücksichtigt, ob jede Summe auf den maximalen Wert addiert wird und ob die Summe aus zwei oder mehr Elementen besteht.

2

hinzufügen:

var found = false; // <--- new 
array.forEach(function(num,idx){ 

Und:

 if(sum === largest){ 
      found = true; // <--- new 
     } 

    }); 

    return found; // <--- new 

Wie @Hamms in den Kommentaren gesagt, ein return innerhalb eines forEach wird nur innerhalb der Schleife zurückkehren und wird nicht Rückkehr der äußere Funktion ArrayAdditionI

JSFiddle: https://jsfiddle.net/f782dcps/