Cum să Reverse un șir de caractere în Java folosind recursiunea

⚡ Rezumat inteligent

Revintroducerea unui șir de caractere Java Recursivitatea funcționează prin eliminarea primului caracter, inversarea a ceea ce rămâne și adăugarea primului caracter la sfârșit. Un șir gol oprește apelurile și desface stiva.

  • 🔘 Caz de baza: Metoda returnează imediat ce isEmpty() raportează că nu a mai rămas nimic de inversat.
  • ☑️ Pas recursiv: substring(1) elimină primul caracter, iar charAt(0) îl pune înapoi după restul inversat.
  • neschimbabilitatea: Fiecare apel produce un nou obiect String, deoarece un Java Șirul de caractere nu poate fi niciodată editat pe loc.
  • 🧪 Trace: Guru99 devine 99uruG după șapte apeluri, câte unul pentru fiecare caracter plus cazul de bază gol.
  • 🛠️ Opțiuni mai rapide: StringBuilder.reverse() și o schimbare cu doi indicatori peste toCharArray() se termină ambele într-o singură trecere.
  • 📌 Pretul biletului: Recursivitatea cu substring() se execută în timp pătratic și conține un cadru de stivă per caracter.

Java program care inversează un șir de caractere folosind o metodă recursivă

În acest exemplu de program, vom inversa un șir introdus de un utilizator.

Vom crea o funcție pentru a inversa un șir. Later O vom apela recursiv până când toate caracterele sunt inversate. Recursivitatea se potrivește acestei probleme deoarece un șir inversat este pur și simplu coada inversată a șirului cu primul caracter original blocat la capăt, ceea ce reprezintă aceeași problemă cu un caracter mai mic.

Scrie o Java Program pentru Reverse Şir

Clasa de mai jos declară intrarea în main(), o transmite către reverseString() și afișează rezultatul. Două apeluri println() în interiorul metodei fac fiecare pas recursiv vizibil în consolă.

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 ieșire:

Fiecare linie a ieșirii este un apel recursiv. Coada afișată pe fiecare linie este cu un caracter mai scurtă decât linia de deasupra ei, iar linia finală arată rezultatul inversat.

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

Cum recursivul RevLucrări ersale pas cu pas

Două linii conțin întreaga metodă. Cazul de bază, if (myStr.isEmpty()), oferă recursivității un loc unde să se oprească. Linia recursivă, return reverseString(myStr.substring(1)) + myStr.charAt(0), împarte munca în două: substring(1) este tot ce se află după primul caracter, iar charAt(0) este primul caracter, adăugat la după restul inversat.

Tracintroducerea datelor de intrare Guru99 face ordinul clar. Java împinge un cadru pentru fiecare apel înainte de a avea loc orice concatenare:

ApelmyStrTransferat la următorul apelExpresie care așteaptă să se termine
1Guru99uru99reverseString(„uru99”) + G
2uru99ru99reverseString(„ru99”) + u
3ru99u99șir invers(„u99”) + r
4u9999reverseString(„99”) + u
5999șir_invers(„9”) + 9
69(gol)șir_revers("") + 9
7(gol)cazul de bază atinsreturnează șirul gol

Stiva se desface apoi de jos în sus, iar fiecare cadru adaugă caracterul salvat: șirul gol devine 9, apoi 99, apoi 99u, 99ur, 99uru și în final 99uruG. pentru că Java Șirurile de caractere sunt imuabile, niciuna dintre aceste valori intermediare nu o suprascrie pe cea anterioară — fiecare concatenare alocă un nou obiect String.

Două detalii din ieșirea consolei merită menționate. A șasea linie se termină cu zero după două puncte, deoarece substring(1) pe un șir de un caracter returnează șirul gol în loc de nul. Mesajul care urmează este „String in now Empty” în programul original; formularea este o greșeală de scriere pentru „String is now empty” și a fost lăsată nemodificată, astfel încât codul și ieșirea de mai sus se potrivesc în continuare linie cu linie.

Alte modalități de a Reverse un șir de caractere în Java

Recursivitatea este cea mai clară modalitate de a vedea Inversarea se întâmplă, dar rareori se întâmplă așa cum o face codul de producție. Trei alternative acoperă aproape fiecare caz real.

1. StringBuilder.reverse() este cea mai scurtă și cea mai rapidă. Clasa are o metodă reverse() încorporată, astfel încât întreaga sarcină se potrivește pe o singură linie:

String reversed = new StringBuilder(myStr).reverse().toString();

2. O buclă for cu charAt() parcurge șirul de caractere invers de la ultimul index până la zero. Intervievatorii solicită adesea această versiune deoarece prezintă logica în loc să o delege:

String reversed = "";
for (int i = myStr.length() - 1; i >= 0; i--) {
    reversed = reversed + myStr.charAt(i);
}

3. O schimbare cu doi indicatori peste toCharArray() convertește șirul într-o matrice de caractere, apoi schimbă caracterele cele mai exterioare spre interior până când pointerii se întâlnesc la mijloc:

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);

Aceeași tehnică de matrice inversează o secvență numerică sau orice altă colecție ordonată, motiv pentru care apare în Java mulțime exerciții la fel de des ca în cele cu coarde.

Complexitatea timpului și spațiului fiecărei abordări

Cele patru versiuni nu costă la fel. Ambele intrări pătratice de mai jos au o cauză comună: creează un șir complet nou la fiecare pas, iar copierea a n caractere de n ori este o muncă la pătrat.

AbordareaTimpSpațiu suplimentarDe ce
Recursivitate cu substring()O(n²)O(n²)substring() copiază caracterele rămase la fiecare apel și se păstrează câte un frame de stivă pentru fiecare caracter.
buclă for cu charAt() și +O(n²)O(n²)Fiecare concatenare alocă un nou șir de caractere și copiază tot ce a fost adunat până acum.
StringBuilder.reverse()O (n)O (n)Un buffer mutabil, o trecere și perechile de surogate sunt păstrate intacte
Două indicatori peste toCharArray()O (n)O (n)O copie a matricei, apoi n/2 schimburi fără alocare ulterioară

Alegeți versiunea recursivă pentru a învăța sau a demonstra cum se comportă stiva de apeluri, versiunea char-array atunci când un intervievator solicită logica manual și StringBuilder.reverse() în orice este inclus. Același compromis între o soluție didactică și una de producție apare în exercițiile clasice, de la sortare cu bule si Seria Fibonacci la verificări ale numerelor prime; fiecare merită exersat Java în ambele sensuri.

Întrebări frecvente

Obiectele de tip șir de caractere sunt imuabile, deci caracterele din interiorul unuia nu se pot schimba niciodată după creare. Prin urmare, fiecare inversare construiește un obiect nou. Folosiți StringBuilder sau o matrice de caractere atunci când caracterele trebuie modificate fără a aloca un nou șir de caractere la fiecare pas.

Primul apel către isEmpty() generează o excepție NullPointerException, deoarece metoda este invocată fără valoare. Protejați punctul de intrare cu o verificare nulă care returnează null sau generează o excepție IllegalArgumentException înainte de începerea oricărei recursiuni.

Nu este fiabil. charAt() funcționează pe unități de cod pe 16 biți, astfel încât un caracter stocat ca pereche surogat este divizat, iar textul inversat arată pătrate de înlocuire. StringBuilder.reverse() păstrează perechile surogat împreună, ceea ce o face alegerea mai sigură pentru textul Unicode.

StringBuilder, în aproape fiecare caz. Ambele expun aceeași metodă reverse(), dar StringBuffer sincronizează fiecare apel, ceea ce costă viteză. Alegeți StringBuffer numai atunci când un buffer este cu adevărat partajat între fire de execuție.

Împărțiți propoziția pe spații albe cu split(” “), apoi parcurgeți matricea rezultată de la ultimul index la primul, adăugând fiecare cuvânt la un StringBuilder. Caracterele din interiorul fiecărui cuvânt rămân în ordinea lor originală.

Se folosește un singur frame de stivă per caracter, așa că sunt tipice câteva mii de caractere înainte de apariția unei erori StackOverflowError. Limita exactă depinde de dimensiunea stivei de thread-uri JVM. Orice versiune iterativă evită complet plafonul.

Un asistent cu inteligență artificială poate citi o stivă trace., indicați un caz de bază lipsă sau inaccesibil și explicați ordinea în care se desfășoară cadrele. De asemenea, elaborează teste pentru cazuri marginale pentru intrări goale, cu un singur caracter și nule. Verificați raționamentul în raport cu o rulare reală.

Da. Co-pilot de obicei, completează o metodă inversă completă doar pornind de la semnătură, oferind adesea mai întâi forma StringBuilder. Verificați cazul de bază și complexitatea, deoarece cea mai scurtă sugestie nu este întotdeauna versiunea solicitată de un exercițiu.

Rezumați această postare cu: