2017-12-27 9 views
-3

Ich habe zwei gegeben Strings: String a = "111" und String b = "132", für diese beiden String ich diese Zählung erreichen wollen:Zählen mit Java

111 
112 
121 
122 
131 
132 

Ein anderes Beispiel ist, wenn ich zwei gegebenen String wie dieses: String a = "1111" und String b = "1223" erwarte ich, dass dieses Ergebnis:

1111 
1112 
1113 
1121 
1122 
1123 
1211 
1212 
1213 
1221 
1222 
1223 

diese können auch längere Strings wie String a = "0100110" und String b = "01101120" sein.

ich diese Zeichenfolge von dem Benutzer in Zustand warte, dass jedes Zeichen in String a sollte in String b (String a = „11“ und b = String „00“ = < nicht als die gleichen Zeichenposition geringer oder gleich sein erlaubt)

Dies ist eine rekursive Methode bis jetzt aber sehr gut funktioniert nicht, weil es auf den Eingang je Nummer zweimal oder mehr erzeugt:

public void expand(String l,String h){ 
for(int i=l.length()-1; i>=0; i--) 
{ 
    sb = new StringBuffer(l);    
    if(charToDigit(l.charAt(i)) < charToDigit(h.charAt(i))) {   
     sb.replace(i, i+1, inc(sb.charAt(i))); 
     expand(sb.toString(),h); 
     System.out.println(sb.toString()); 
    } 
} 
} 
+0

Was haben Sie versucht? Was ist dein Code bisher? [Bitte lesen Sie die Richtlinien zum Verfassen einer guten Frage] (https://stackoverflow.com/help/how-to-ask) – ubadub

+0

Ich habe bis jetzt kein gutes Ergebnis! Ich warte auf etwas Robustes, das dieses Problem gut behandeln kann. –

+0

Wissen Sie, wie man Java programmiert? Hast du etwas geschrieben, um zumindest Eingaben zu machen? – ubadub

Antwort

0

Rufen sie die kleinere Zahl x und die größere Anzahl y . Wenn Sie y mod 10 (y % 10) berechnen, finden Sie den Wert der niedrigstwertigen Ziffer, rufen Sie n. Berechnen Sie auf ähnliche Weise die niedrigstwertige Ziffer x, nennen Sie sie m. Erstellen Sie dann zunächst eine temporäre Variable i, die gleich x ist. Schleife bis diese Zahl gleich y ist.

In den Körper der Schleife, zuerst drucken i. Dann, wenn die niedrigstwertige Stelle von i (wieder, berechnet durch i % 10), rufen Sie o, ist weniger als n, erhöhen Sie i um eins. Andernfalls, wenn o == n, erhöhen Sie i durch 10 - n + m. Natürlich, wenn es jemals der Fall ist, dass o > n, ging etwas schief (d. H. Ungültige Eingabe vom Benutzer), da die Garantie war, dass alle Ziffern x kleiner oder gleich den entsprechenden Ziffern in y sind.

Also, in Pseudo-Code:

x = smaller number 
y = larger number 
n = y % 10 
m = x % 10 
i = x 

while (i <= y): 
    print i 
    o = i % 10 
    if (o < n): 
     i += 1 
    else if (o == n): 
     i += 10 - n + m 
0

Hier ist meine Lösung

static String l="000"; 
static String h="232"; 
static ArrayList<String> combinations = new ArrayList<String>(); 
static int stringLength= l.length(); 

for(int i=0; i<rulelength; i++) 
{ 
    combinations.add((charToDigit(h.charAt(i)) - charToDigit(l.charAt(i))+1)+""); 
} 
int number = 1; 
for(int i=0; i<combinations.size(); i++) 
{ 
    number*=Integer.parseInt(combinations.get(i)); 
} 
int change = Integer.parseInt(combinations.get(combinations.size()-1)); 
expand(l, h, change, number); 

public static void expand(String l, String h, int change, int comb) 
{ 
    StringBuffer sb = new StringBuffer(l); 
    int pos = stringLength-1; 
    int tmpPos = pos; 
    for(int i=1; i<=comb; i++) 
    { 
     System.out.println(sb.toString()); 
     sb.replace(pos, pos+1, inc(sb.charAt(pos))); 
     if((i % change)==0) { 
      for(int j=stringLength-1; j>0; j--) 
      { 
       if(charToDigit(sb.charAt(j)) >= (Integer.parseInt(combinations.get(j))-1)) 
        tmpPos = j-1;     
       else 
        break; 
      } 
      sb.replace(tmpPos, tmpPos+1, inc(sb.charAt(tmpPos))); 
      for(int j=stringLength-1; j>tmpPos; j--) 
      { 
       sb.replace(j, j+1, l.charAt(j)+""); 
      } 
     } 
    } 
}