Code richtig / besser machbar? (Nicht sicher, ob Code selbst falsch ist)

Sot Burst

Mitglied
Hallo,

Folgendes wollte ich umsetzen, und irgendwie ist der Wurm drin.
Ich habe eine Variable s, die Anzahl an Stellen beschreibt, und die Variable n, der den Maximalwert angibt.

Dann brauch ich folgendes in einem Array:

wenn n=3, und s=2
01
02
03
12
13
23

oder wenn n=5, und s=3
012
013
014
015
023
024
025
034
035
045
123
124
125
134
135
145
234
235
245
345

Note:
während der verschiedenen "Phasen", benutze ich diese Zahlen in einem anderen Zusammenhang.

Also soll immer die Ziffer ganz rechts erhöht werden, und wenn sie "n" erreicht soll die Ziffer links davon hoch gesetzt, und die Ziffer selbst auf einen über den Wert links neben sich gesetzt werden. An sich klingt das Prinzip einfach, aber ich verdrehe mich da wahrscheinlich einfach nur, weil das ganze noch in einem Schleifensystem hängt.

Ich hab das ganze aktuell so gelöst:
Code:
       boolean bool = true;
       int[] stellen = new int[s];

       // startnummern
       for (int i3 = 0; i3 < stellen.length; i3++) {
           stellen[i3] = i3;
       }

       while (bool) {

           // Hier wird das Array "stellen" verarbeitet

           stellen[0]++;

           // stellenüberprüfen, ob eine umgestellt werden muss
           for (int i3 = 0; i3 < stellen.length; i3++) {
               if (stellen[i3] > n - i3) {
                   if (i3 < stellen.length - 1) {
                       stellen[i3 + 1] += 1;
                       stellen[i3] = stellen[i3 + 1] + 1;
                   } else {
                       // wenn der letzte zu groß ist, dann ist das gesammte zu ende
                       bool = false;
                   }

               }
           }

       }

Wenn mir jemand sagen kann, ob er hier ein Fehler findet (evtl gibt es auch keinen Fehler und der Fehler liegt in der Verarbeitung, oder bei der übermittlung) oder ob er eine leichtere / übersichtlichere Lösung findet oder ob ihr meine Lösung richtig und gut findet.

Würde mich über Antworten freuen,
Gruß Söncke
 
Hallo.

Ich habe eine Variable s, die Anzahl an Stellen beschreibt

....

wenn n=3, und s=2

Ich verstehe deine Beschreibung so, dass s besagt wie viel Stellen die Zahl haben darf, richtig?

Falls ja, dann sollte die korrekte Ausgabe doch

0
1
2
3
10
11
12
13
...
90
91
92
93

sein oder?

Ansonsten kann man es wunderbar mit einer Rekursion lösen und am ende erhälst du dann das gefüllte Array zurück.

Grüße
 
Hallo,

und danke für die sehr schnelle Antwort. Ich habe in einem anderen Zusammenhang, bei jemanden der ein zumindest in die gleiche Richtung gehendes Problem hatte, auch gehört das man das irgendwie mithilfe von Rekursion gehen soll. Aber mit meinen dunklen Erinnerung an Rekursion (Ich meine das war, wenn man mit einer Methode sich selbst aufruft) hatte ich es nicht hingekriegt.

und jetzt zum 2:
Du hast das System nicht ganz verstanden, es soll folgender Maßen sein:

1.) Jede Ausgabe hat immer s-Stellen
2.) Es gibt niemals 2 gleiche Ziffern
3.) Keine Ziffer darf n überschreiten
und 4.) um Doppelungen zu vermeiden darf eine Zahl niemals kleiner sein als der linke "Partner"

Das heißt es wäre nicht
0
1
2
3
10
11
12
13
...
90
91
92
93
sondern

01
02
03
12
13
23

und mehr auch nicht.


Danke schonmal im vorraus, und wenn etwas unklar ist gerne nachfragen.
 
Hier hab ich mal zwei Versuche wobei Versuch 2 einfacher zu verstehen ist:
Java:
private static List<Integer> numbers(int n, int max) {
  if (n <= 0) return Collections.emptyList();
  if (max == 0) return Collections.nCopies(n, max);
  if (max < 0 || 9 < max) throw new IllegalArgumentException();
  List<Integer> result = new ArrayList<>();
  Queue<Integer> work = new ArrayDeque<>(Arrays.asList(0));
  while (!work.isEmpty()) {
    int element = work.poll();
    result.add(element);
    if (element % 10 < max) {
      work.offer(element + 1);
    }
    if (element != 0 && ((int) Math.log10(element) + 1) < n) {
      work.offer(element * 10);
    }
  }
  return result;
}

private static List<Integer> numbers2(int n, int max) {
  if (n <= 0) return Collections.emptyList();
  if (max == 0) return Collections.nCopies(n, max);
  if (max < 0 || 9 < max) throw new IllegalArgumentException("max has to be a positive digit");
  List<Integer> result = new ArrayList<>();
  int radix = max + 1;
  for (int i = 0; Integer.toString(i, radix).length() <= n; i++) {
    result.add(Integer.parseInt(Integer.toString(i, radix)));
  }
  return result;
}
 
Hallo.

Auch dir Vielen Dank, für den Lösungsvorschlag.
Es ist genau das, was ich als System gesucht habe, weil die einzelnen Ziffern auch 10 überschreiten können sollen, aber ich glaube, ich werde gleich mal probieren die erste Lösung entsprechend anzupassen.

Melde mich noch
 

Zurück
Oben