• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Nach meinen Wünschen sortieren

FreddyFY

Neues Mitglied
Hey,

hätte mal ne frage.

Ich habe einen array
Code:
var array = ["20",  "15", "15", "8", "8", "9", "10"]

nun möchte ich dass sich meine Arrays so anordnen dass sie in der Summe so nah wie möglich an 30 rankommen.

z. B. so:
20 + 10 = 30;
15 + 15 = 30;
9 + 8 + 8 = 25;

So sind die Arrays so angeordnet dass sie so wenig wie möglich Rest erzeugen.

Deshalb möchte ich dass sich die Arrays in dieser Reihenfolge anordnen:
Code:
"20", "10", "15", "15", "9", "8", "8"

Ich hoffe ich konnte es verständlich genug beschreiben und es nicht ganz so kompliziert ist.

Freddy
 
Werbung:
1. macht es nicht unbedingt Sinn, Zahlen als Strings in ein Array zu schreiben.
2. wo ist die Logik für die gewünschte Ausgabe?
 
Werbung:
ich hab aus interesse mal versucht wie man das lösen könnte, hier mal meine Lösung dazu (Verbesserungsvorschläge gern gesehen)
Code:
<html>
  <head>
  <title>test</title>
  <script type="text/javascript">
  //prueft obs ein int ist
  function isInt(n){
  return typeof n== "number" && isFinite(n) && n%1===0;
  }
 
  //aufsteigend sortieren
  function Numsort (a, b) {
   return a - b;
  }
 
  function sort_array(){
  var array = [20,  15, 15, 8, 8, 9, 10];
  array.sort(Numsort);
  array.reverse();//array "umdrehen"
  var done = false;
  var new_array = new Array(array.length);
  var new_index = 0;
  var naeherungswert = 30;
  var check = false;
  while(!done){
//wenn man hier bei 0 ist fuellt er noch ggf. nullen im array auf weil utnen ja alles hittet (0+0=0) und ist dann done
  if(naeherungswert == 0){
   done = true;
  }
  for(var i = 0;i < array.length;i++){
  for(var j = (i +1);j < array.length;j++){
   if(array[i] + array[j] == naeherungswert){//wenns den naeherungswert erreicht ins neue array schreiben
new_array[new_index] = array[i];
  new_array[(new_index + 1)] = array[j];
  new_index += 2;
  array[i] = null;
  array[j] = null;
  }
  }
  }
  //hier koennte man eig direkt done befuellen, aber wenn man mal bis 0 kommt und
  //aus irgend nem grund noch iwo kein int drin ist gibts dann ne endlosschleife,
  //weil er done wieder auf false setzt
  for(var test = 0;test < new_array.length;test++){
   if(isInt(new_array[test])){
   check = true;
  }else{
   check = false;
  }
  }
  //desswegen erst hier auf done
  if(check){
  done = true;
  }else{
   naeherungswert -= 1;//sonst einfach "einen schritt weiter"
  }
  }
  //wollte das irgendwo reinschreiben, man kann hier sonst natürlich auch einfach n array draus machen
  for(var k = 0;k < new_array.length;k++){
  if(new_array[k] != null){//falls sich da mal von oben n null rein verirrt
   document.getElementById('test').innerHTML += new_array[k];
  }
  }
  }
  </script>
  </head>
  <body onload="sort_array()"><p id="test"></p></body>
</html>
 
Zurück
Oben