Hvordan man Reverse en streng i Java ved hjælp af rekursion

⚡ Smart opsummering

Revslette en streng ind Java Med rekursion fungerer det ved at fjerne det første tegn, vende det resterende tegn tilbage og tilføje det første tegn til slutningen. En tom streng stopper kaldene og afvikler stakken.

  • 🔘 Basisscenarie: Metoden returnerer med det samme, når isEmpty() rapporterer, at der ikke er noget tilbage at tilbageføre.
  • ☑️ Rekursivt trin: substring(1) fjerner det første tegn, og charAt(0) sætter det tilbage efter den omvendte rest.
  • uforanderlighed: Hvert kald producerer et nyt String-objekt, fordi a Java Strengen kan aldrig redigeres på stedet.
  • 🧪 Trace: Guru99 bliver til 99uruG efter syv kald, et for hvert tegn plus det tomme basistilfælde.
  • 🛠️ Hurtigere muligheder: StringBuilder.reverse() og et two-pointer swap over toCharArray() afsluttes begge i én omgang.
  • 📌 Omkostninger: Rekursion med substring() kører i kvadratisk tid og indeholder én stakramme pr. tegn.

Java et program, der vender en streng ved hjælp af en rekursiv metode

I dette eksempelprogram vil vi vende en streng indtastet af en bruger.

Vi vil oprette en funktion til at vende en streng. Later Vi kalder det rekursivt, indtil alle tegn er omvendte. Rekursion passer til dette problem, fordi en omvendt streng simpelthen er den omvendte hale af strengen med det oprindelige første tegn fastgjort for enden, hvilket er det samme problem et tegn mindre.

Skriv en Java Program til Reverse String

Klassen nedenfor deklarerer inputtet i main(), sender det til reverseString() og udskriver det, der kommer tilbage. To println()-kald i metoden gør hvert rekursive trin synligt i konsollen.

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 Output:

Hver linje i outputtet er ét rekursivt kald. Halen, der er trykt på hver linje, er et tegn kortere end linjen ovenover, og den sidste linje viser det omvendte resultat.

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

Hvordan den rekursive Reversal Works Trin for Trin

To linjer bærer hele metoden. Basistilfældet, if (myStr.isEmpty()), giver rekursionen et sted at stoppe. Den rekursive linje, return reverseString(myStr.substring(1)) + myStr.charAt(0), deler arbejdet i to: substring(1) er alt efter det første tegn, og charAt(0) er det første tegn, tilføjet. efter den omvendte rest.

Tracinputtet Guru99 gør rækkefølgen klar. Java skubber én frame for hvert kald, før der sker nogen sammenkædning:

Ring til os påminStrVideregivet til næste opkaldUdtryk venter på at blive færdigt
1Guru99uru99omvendtStreng("uru99") + G
2uru99ru99omvendtStreng("ru99") + u
3ru99u99omvendtStreng("u99") + r
4u9999omvendtStreng("99") + u
5999omvendtStreng("9") + 9
69(tom)omvendtStreng("") + 9
7(tom)basisscenariet er nåetreturnerer den tomme streng

Stakken rulles derefter ud fra bunden og opad, og hver frame tilføjer sit gemte tegn: den tomme streng bliver 9, derefter 99, derefter 99u, 99ur, 99uru og til sidst 99uruG. Fordi Java Strenge er uforanderlige, ingen af ​​disse mellemliggende værdier overskriver den foregående — hver sammenkædning allokerer et nyt String-objekt.

To detaljer i konsoloutputtet er værd at nævne. Den sjette linje slutter med ingenting efter kolon, fordi substring(1) på en streng på et tegn returnerer den tomme streng i stedet for null. Den efterfølgende besked lyder "String in now Empty" i det originale program; formuleringen er en slåfejl for "String is now empty" og er blevet ladt uændret, så koden og outputtet ovenfor stadig matcher linje for linje.

Andre måder at Reverse en streng i Java

Rekursion er den klareste måde at se omvendingen sker, men det er sjældent den måde, produktionskoden gør det på. Tre alternativer dækker næsten alle virkelige tilfælde.

1. StringBuilder.reverse() er den korteste og hurtigste. Klassen har en indbygget reverse() metode, så hele jobbet passer på én linje:

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

2. En for-løkke med charAt() går strengen baglæns fra det sidste indeks til nul. Interviewere beder ofte om denne version, fordi den viser logikken i stedet for at delegere den:

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

3. En to-pointer ombytning til CharArray() konverterer strengen til et char-array og bytter derefter de yderste tegn indad, indtil pointerne mødes i midten:

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

Den samme arrayteknik vender en numerisk sekvens eller enhver anden ordnet samling om, hvilket er grunden til, at den optræder i Java matrix øvelser lige så ofte som i strengeøvelser.

Tids- og rumkompleksitet for hver tilgang

De fire versioner koster ikke det samme. Begge kvadratiske poster nedenfor deler én årsag: de opretter en helt ny streng i hvert trin, og at kopiere n tegn n gange er n kvadratisk arbejde.

TilgangTidEkstra pladsHvorfor
Rekursion med substring()O(n²)O(n²)substring() kopierer de resterende tegn ved hvert kald, og én stakramme holdes pr. tegn
for-løkke med charAt() og +O(n²)O(n²)Hver sammenkædning allokerer en ny streng og kopierer alt, der er indsamlet indtil videre.
StringBuilder.reverse()O (n)O (n)Én muterbar buffer, ét gennemløb og surrogatpar holdes intakte
To pointere over tilCharArray()O (n)O (n)Én array-kopi, derefter n/2 swaps uden yderligere allokering

Vælg den rekursive version for at lære eller demonstrere, hvordan call stacken opfører sig, char-array-versionen, når en interviewer beder om logikken manuelt, og StringBuilder.reverse() i alt, der sendes. Den samme afvejning mellem en undervisningsløsning og en produktionsløsning ses på tværs af de klassiske øvelser, fra boble sortering og Fibonacci-serien til primtalkontroller; hver enkelt er værd at øve sig i Java begge veje.

Ofte Stillede Spørgsmål

Stringobjekter er uforanderlige, så tegnene i et objekt kan aldrig ændres efter oprettelsen. Hver vending opbygger derfor et nyt objekt. Brug StringBuilder eller et char-array, når tegnene skal ændres uden at allokere en ny streng i hvert trin.

Det første kald til isEmpty() kaster en NullPointerException, fordi metoden kaldes på ingenting. Beskyt indgangspunktet med en null-kontrol, der returnerer null eller kaster IllegalArgumentException, før nogen rekursion begynder.

Ikke pålideligt. charAt() fungerer på 16-bit kodeenheder, så et tegn, der er gemt som et surrogatpar, opdeles, og den omvendte tekst viser erstatningskvadrater. StringBuilder.reverse() holder surrogatpar sammen, hvilket gør det til det sikrere valg til Unicode-tekst.

StringBuilder, i næsten alle tilfælde. Begge eksponerer den samme reverse() metode, men StringBuffer synkroniserer hvert opkald, hvilket koster hastighed. Vælg StringBuffer kun når én buffer reelt deles mellem tråde.

Opdel sætningen på mellemrum med split(" "), og skift derefter det resulterende array fra det sidste indeks til det første, og tilføj hvert ord til en StringBuilder. Tegnene i hvert ord forbliver i deres oprindelige rækkefølge.

Der bruges én stakramme pr. tegn, så et par tusinde tegn er typisk, før en StackOverflowError vises. Den nøjagtige grænse afhænger af JVM-trådstakkens størrelse. Enhver iterativ version undgår loftet helt.

En AI-assistent kan læse en stak trace.g. peger på et manglende eller uopnåeligt basistilfælde, og forklarer rækkefølgen, hvori frames afvikles. Den udarbejder også edge-case-tests for tomt, enkelttegns- og nul-input. Bekræft argumentationen i forhold til en reel kørsel.

Ja. CoPilot udfører normalt en hel omvendt metode alene fra signaturen, og tilbyder ofte StringBuilder-formularen først. Tjek basistilfældet og kompleksiteten, da det korteste forslag ikke altid er den version, en øvelse beder om.

Opsummer dette indlæg med: