So erreichen Reverse eine Zeichenkette in Java Rekursion verwenden
⚡ Intelligente Zusammenfassung
Reversing a string in Java Die Rekursion funktioniert, indem sie das erste Zeichen entfernt, den Rest umkehrt und das erste Zeichen an das Ende anhängt. Ein leerer String beendet die Aufrufe und räumt den Stack auf.
In diesem Beispielprogramm kehren wir eine von einem Benutzer eingegebene Zeichenfolge um.
Wir erstellen eine Funktion zum Umkehren einer Zeichenfolge. Later Wir rufen die Funktion rekursiv auf, bis alle Zeichen umgekehrt sind. Rekursion eignet sich für dieses Problem, da eine umgekehrte Zeichenkette einfach das umgekehrte Ende der Zeichenkette ist, an das das ursprüngliche erste Zeichen angehängt wird – also im Prinzip dasselbe Problem, nur mit einem Zeichen weniger.
Schreiben Java Programm zu Reverse Schnur
Die unten stehende Klasse deklariert die Eingabe in `main()`, übergibt sie an `reverseString()` und gibt das Ergebnis aus. Zwei `println()`-Aufrufe innerhalb der Methode machen jeden Rekursionsschritt in der Konsole sichtbar.
package com.guru99; public class ReverseString { public static void main(String[] args) { String myStr = "Guru99"; //create Method and pass and input parameter string String reversed = reverseString(myStr); System.out.println("The reversed string is: " + reversed); } //Method take string parameter and check string is empty or not public static String reverseString(String myStr) { if (myStr.isEmpty()){ System.out.println("String in now Empty"); return myStr; } //Calling Function Recursively System.out.println("String to be passed in Recursive Function: "+myStr.substring(1)); return reverseString(myStr.substring(1)) + myStr.charAt(0); } }
Code Ausgang:
Jede Zeile der Ausgabe entspricht einem rekursiven Aufruf. Der Rest jeder Zeile ist ein Zeichen kürzer als der der Zeile darüber, und die letzte Zeile zeigt das umgekehrte Ergebnis.
String to be passed in Recursive Function: uru99 String to be passed in Recursive Function: ru99 String to be passed in Recursive Function: u99 String to be passed in Recursive Function: 99 String to be passed in Recursive Function: 9 String to be passed in Recursive Function: String in now Empty The reversed string is: 99uruG
Wie die Rekursive Revversal funktioniert Schritt für Schritt
Die gesamte Methode besteht aus zwei Zeilen. Der Basisfall `if (myStr.isEmpty())` gibt der Rekursion eine Abbruchstelle. Die rekursive Zeile `return reverseString(myStr.substring(1)) + myStr.charAt(0)` teilt die Arbeit in zwei Teile: `substring(1)` enthält alles nach dem ersten Zeichen, und `charAt(0)` ist das angehängte erste Zeichen. nachdem der umgekehrte Rest.
TracEingabe Guru99 macht die Reihenfolge deutlich. Java überträgt für jeden Aufruf einen Frame, bevor eine Verkettung erfolgt:
| Telefon | myStr | Weitergeleitet an den nächsten Anrufer | Ausdruck wartet auf Fertigstellung |
|---|---|---|---|
| 1 | Guru99 | uru99 | reverseString(“uru99”) + G |
| 2 | uru99 | ru99 | reverseString(“ru99”) + u |
| 3 | ru99 | u99 | reverseString(“u99”) + r |
| 4 | u99 | 99 | reverseString(“99”) + u |
| 5 | 99 | 9 | reverseString(“9”) + 9 |
| 6 | 9 | (Leer) | reverseString(“”) + 9 |
| 7 | (Leer) | Basisfall erreicht | gibt die leere Zeichenkette zurück |
Der Stapel wird dann von unten nach oben abgewickelt, und jeder Frame hängt sein gespeichertes Zeichen an: Die leere Zeichenkette wird zu 9, dann zu 99, dann zu 99u, 99ur, 99uru und schließlich zu 99u. 99uruG. weil Java Zeichenketten sind unveränderlich, keiner dieser Zwischenwerte überschreibt den vorherigen – jede Verkettung erzeugt ein neues String-Objekt.
Zwei Details in der Konsolenausgabe sind erwähnenswert. Die sechste Zeile endet nach dem Doppelpunkt mit nichts, da `substring(1)` bei einer Ein-Zeichen-Zeichenkette eine leere Zeichenkette anstelle von `null` zurückgibt. Die darauf folgende Meldung lautet im Originalprogramm „String in now Empty“; die Formulierung ist ein Tippfehler und sollte „String is now empty“ lauten. Dieser Fehler wurde beibehalten, sodass Code und Ausgabe weiterhin zeilenweise übereinstimmen.
Andere Wege zu Reverse eine Zeichenkette in Java
Rekursion ist der deutlichste Weg, um sehen Die Umkehrung kommt vor, aber sie erfolgt selten auf die Art und Weise, wie es im Produktionscode geschieht. Drei Alternativen decken nahezu alle realen Fälle ab.
1. StringBuilder.reverse() ist die kürzeste und schnellste Lösung. Die Klasse verfügt über eine integrierte reverse()-Methode, sodass der gesamte Code in eine Zeile passt:
String reversed = new StringBuilder(myStr).reverse().toString();
2. Eine for-Schleife mit charAt() Durchläuft die Zeichenkette rückwärts vom letzten Index bis Null. Interviewer fragen oft nach dieser Version, weil sie die Logik zeigt, anstatt sie zu delegieren:
String reversed = ""; for (int i = myStr.length() - 1; i >= 0; i--) { reversed = reversed + myStr.charAt(i); }
3. Ein Zwei-Zeiger-Tausch über toCharArray() wandelt die Zeichenkette in ein char-Array um und vertauscht dann die äußersten Zeichen nach innen, bis sich die Zeiger in der Mitte treffen:
char[] chars = myStr.toCharArray(); int left = 0; int right = chars.length - 1; while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } String reversed = new String(chars);
Dieselbe Array-Technik kehrt eine Zahlenfolge oder jede andere geordnete Sammlung um, weshalb sie auftaucht in Java Array Übungen so häufig wie bei Streicherübungen.
Zeit- und Speicherkomplexität der einzelnen Ansätze
Die vier Versionen haben unterschiedliche Kosten. Beide unten aufgeführten quadratischen Einträge haben eine gemeinsame Ursache: Sie erzeugen in jedem Schritt eine neue Zeichenkette, und das n-malige Kopieren von n Zeichen entspricht dem Arbeitsaufwand n².
| Ansatz | Zeit | Zusätzlicher Platz | Warum |
|---|---|---|---|
| Rekursion mit substring() | O(n²) | O(n²) | Die Funktion substring() kopiert bei jedem Aufruf die verbleibenden Zeichen, wobei pro Zeichen ein Stack-Frame reserviert wird. |
| for-Schleife mit charAt() und + | O(n²) | O(n²) | Bei jeder Verkettung wird ein neuer String erstellt und alles bisher gesammelte kopiert. |
| StringBuilder.reverse() | O (n) | O (n) | Ein veränderlicher Puffer, ein Durchlauf und Ersatzpaare bleiben intakt |
| Zwei Zeiger auf toCharArray() | O (n) | O (n) | Einmaliges Kopieren des Arrays, dann n/2 Vertauschungen ohne weitere Allokation |
Wählen Sie die rekursive Version, um das Verhalten des Aufrufstapels zu lernen oder zu demonstrieren, die Version mit Zeichenarrays, wenn ein Interviewer die Logik manuell abfragt, und `StringBuilder.reverse()` in jeder ausgelieferten Version. Derselbe Kompromiss zwischen einer didaktischen und einer produktionsreifen Lösung zeigt sich in den klassischen Übungen, von Blase sortieren und der Fibonacci-Serie zu PrimzahlprüfungenJede einzelne ist es wert, geübt zu werden Java beide Wege.
