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.
Î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:
| Apel | myStr | Transferat la următorul apel | Expresie care așteaptă să se termine |
|---|---|---|---|
| 1 | Guru99 | uru99 | reverseString(„uru99”) + G |
| 2 | uru99 | ru99 | reverseString(„ru99”) + u |
| 3 | ru99 | u99 | șir invers(„u99”) + r |
| 4 | u99 | 99 | reverseString(„99”) + u |
| 5 | 99 | 9 | șir_invers(„9”) + 9 |
| 6 | 9 | (gol) | șir_revers("") + 9 |
| 7 | (gol) | cazul de bază atins | returnează ș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.
| Abordarea | Timp | Spațiu suplimentar | De 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.
