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.

  • 🔘 Basisfall: Die Methode gibt sofort einen Wert zurück, wenn isEmpty() meldet, dass nichts mehr rückgängig zu machen ist.
  • ☑️ Rekursiver Schritt: substring(1) entfernt das erste Zeichen und charAt(0) fügt es nach dem umgekehrten Rest wieder ein.
  • Unveränderlichkeit: Jeder Aufruf erzeugt ein neues String-Objekt, weil ein Java Eine Zeichenkette kann niemals direkt an Ort und Stelle bearbeitet werden.
  • 🧪 Trace: Guru99 wird nach sieben Aufrufen zu 99uruG, einem für jedes Zeichen plus dem leeren Basisfall.
  • Schnellere Optionen: StringBuilder.reverse() und ein Zwei-Zeiger-Tausch bei toCharArray() werden beide in einem einzigen Durchlauf abgeschlossen.
  • 📌 Kosten: Die Rekursion mit substring() hat eine quadratische Laufzeit und benötigt einen Stack-Frame pro Zeichen.

Java Programm, das eine Zeichenkette mithilfe einer rekursiven Methode umkehrt

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:

TelefonmyStrWeitergeleitet an den nächsten AnruferAusdruck wartet auf Fertigstellung
1Guru99uru99reverseString(“uru99”) + G
2uru99ru99reverseString(“ru99”) + u
3ru99u99reverseString(“u99”) + r
4u9999reverseString(“99”) + u
5999reverseString(“9”) + 9
69(Leer)reverseString(“”) + 9
7(Leer)Basisfall erreichtgibt 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².

AnsatzZeitZusätzlicher PlatzWarum
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.

Häufig gestellte Fragen

String-Objekte sind unveränderlich, daher können die darin enthaltenen Zeichen nach ihrer Erstellung nicht mehr geändert werden. Jede Umkehrung erzeugt daher ein neues Objekt. Verwenden Sie `StringBuilder` oder ein `char`-Array, wenn die Zeichen geändert werden müssen, ohne für jeden Schritt einen neuen String zu erstellen.

Der erste Aufruf von `isEmpty()` löst eine `NullPointerException` aus, da die Methode auf leerem Datenfeld aufgerufen wird. Schützen Sie den Einstiegspunkt mit einer Nullprüfung, die `null` zurückgibt oder eine `IllegalArgumentException` auslöst, bevor die Rekursion beginnt.

Nicht zuverlässig. `charAt()` arbeitet mit 16-Bit-Codeeinheiten. Daher wird ein als Ersatzzeichenpaar gespeichertes Zeichen aufgeteilt, und der umgekehrte Text zeigt die Ersatzzeichen an. `StringBuilder.reverse()` behält die Ersatzzeichenpaare zusammen und ist daher die sicherere Wahl für Unicode-Text.

StringBuilder, in fast allen Fällen. Beide bieten dieselbe reverse()-Methode, aber StringBuffer Jeder Aufruf wird synchronisiert, was die Geschwindigkeit beeinträchtigt. Wählen Sie „Zeichenkette“.Buffer nur dann, wenn ein Puffer tatsächlich von mehreren Threads gemeinsam genutzt wird.

Teile den Satz anhand von Leerzeichen mit split(" ") und durchlaufe dann das resultierende Array vom letzten Index zum ersten, wobei jedes Wort an einen StringBuilder angehängt wird. Die Zeichen innerhalb jedes Wortes bleiben in ihrer ursprünglichen Reihenfolge erhalten.

Für jedes Zeichen wird ein Stack-Frame verwendet, daher treten typischerweise einige tausend Zeichen auf, bevor ein StackOverflowError erscheint. Die genaue Grenze hängt von der Größe des JVM-Thread-Stacks ab. Jede iterative Version umgeht diese Grenze vollständig.

Ein KI-Assistent kann einen Stapel lesen trace) Weisen Sie auf einen fehlenden oder nicht erreichbaren Basisfall hin und erläutern Sie die Reihenfolge, in der Frames abgewickelt werden. Es werden auch Grenzfalltests für leere, einstellige und Null-Eingaben entworfen. Überprüfen Sie die Argumentation anhand eines realen Testlaufs.

Ja. Copilot Normalerweise wird allein anhand der Signatur eine vollständige Umkehrmethode erstellt, wobei oft zuerst die StringBuilder-Form angeboten wird. Beachten Sie den Basisfall und die Komplexität, da der kürzeste Vorschlag nicht immer die in der Übung geforderte Version ist.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: