Hvordan Reverse en streng i Java ved hjelp av rekursjon

โšก Smart oppsummering

Revรฅ slette en streng inn Java Med rekursjon fungerer det ved รฅ fjerne det fรธrste tegnet, reversere det som er igjen, og legge til det fรธrste tegnet pรฅ slutten. En tom streng stopper kallene og avvikler stakken.

  • ๐Ÿ”˜ Grunnveske: Metoden returnerer umiddelbart nรฅr isEmpty() rapporterer at ingenting er igjen รฅ reversere.
  • โ˜‘๏ธ Rekursivt trinn: substring(1) fjerner det fรธrste tegnet og charAt(0) setter det tilbake etter den reverserte resten.
  • โœ… uforanderlighet: Hvert kall produserer et nytt String-objekt, fordi a Java Strengen kan aldri redigeres pรฅ stedet.
  • ๐Ÿงช Trace: Guru99 blir 99uruG etter sju kall, ett for hvert tegn pluss det tomme basistilfellet.
  • ๐Ÿ› ๏ธ Raskere alternativer: StringBuilder.reverse() og et to-peker-bytte over til CharArray() fullfรธres begge i รฉn omgang.
  • ๐Ÿ“Œ Kostnad: Rekursjon med substring() kjรธrer i kvadratisk tid og inneholder รฉn stakkramme per tegn.

Java et program som reverserer en streng ved hjelp av en rekursiv metode

I dette eksempelprogrammet vil vi reversere en streng som er skrevet inn av en bruker.

Vi vil lage en funksjon for รฅ reversere en streng. Later Vi kaller det rekursivt til alle tegnene er reversert. Rekursjon passer til dette problemet fordi en reversert streng ganske enkelt er den reverserte halen av strengen med det opprinnelige fรธrste tegnet fast pรฅ enden, som er det samme problemet ett tegn mindre.

Skriv en Java Program til Reverse String

Klassen nedenfor deklarerer inputen i main(), gir den til reverseString(), og skriver ut det som kommer tilbake. To println()-kall inne i metoden gjรธr hvert rekursive trinn synlig 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 Utgang:

Hver linje i utdataene er ett rekursivt kall. Halen som er trykt pรฅ hver linje er ett tegn kortere enn linjen over, og den siste linjen viser det omvendte resultatet.

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 trinn for trinn

To linjer bรฆrer hele metoden. Basistilfellet, if (myStr.isEmpty()), gir rekursjonen et sted รฅ stoppe. Den rekursive linjen, return reverseString(myStr.substring(1)) + myStr.charAt(0), deler arbeidet i to: substring(1) er alt etter det fรธrste tegnet, og charAt(0) er det fรธrste tegnet, lagt til. etter den omvendte resten.

Tracinnspillingen Guru99 gjรธr rekkefรธlgen tydelig. Java skyver รฉn ramme for hvert kall fรธr noen sammenkobling skjer:

AnropminStrOverfรธrt til neste samtaleUttrykk venter pรฅ รฅ bli ferdig
1Guru99uru99reverseString(โ€œuru99โ€) + G
2uru99ru99reverseString(โ€œru99โ€) + u
3ru99u99reversString(โ€œu99โ€) + r
4u9999reversString("99") + u
5999reversString("9") + 9
69(tรธmme)reversString(โ€œโ€) + 9
7(tรธmme)basisscenariet er nรฅddreturnerer den tomme strengen

Stakken rulles deretter ut nedenfra og opp, og hver ramme legger til sitt lagrede tegn: den tomme strengen blir 9, deretter 99, deretter 99u, 99ur, 99uru, og til slutt 99uruG. Fordi Java Strenger er uforanderlige, ingen av disse mellomverdiene overskriver den forrige โ€“ hver sammenkobling tildeler et nytt String-objekt.

To detaljer i konsollutdataene er verdt รฅ nevne. Den sjette linjen slutter med ingenting etter kolon, fordi substring(1) pรฅ en streng med ett tegn returnerer den tomme strengen i stedet for null. Meldingen som fรธlger lyder ยซString in now Emptyยป i det opprinnelige programmet; formuleringen er en skrivefeil for ยซString is now emptyยป og har blitt latt urรธrt, slik at koden og utdataene ovenfor fortsatt samsvarer linje for linje.

Andre mรฅter รฅ Reverse en streng i Java

Rekursjon er den klareste mรฅten รฅ se reverseringen skjer, men det er sjelden slik produksjonskoden gjรธr det. Tre alternativer dekker nesten alle reelle tilfeller.

1. StringBuilder.reverse() er den korteste og raskeste. Klassen har en innebygd reverse()-metode, slik at hele jobben fรฅr plass pรฅ รฉn linje:

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

2. En for-lรธkke med charAt() gรฅr strengen bakover fra siste indeks til null. Intervjuere ber ofte om denne versjonen fordi den viser logikken i stedet for รฅ delegere den:

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

3. En to-poengs bytte over til CharArray() konverterer strengen til en char-array, og bytter deretter de ytterste tegnene innover til pekerne mรธtes 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 arrayteknikken reverserer en numerisk sekvens eller en hvilken som helst annen ordnet samling, og det er derfor den dukker opp i Java matrise รธvelser like ofte som i strengรธvelser.

Tids- og romkompleksiteten til hver tilnรฆrming

De fire versjonene koster ikke det samme. Begge de kvadratiske oppfรธringene nedenfor deler รฉn grunn: de oppretter en helt ny streng i hvert trinn, og รฅ kopiere n tegn n ganger er n kvadratisk arbeid.

TilnรฆrmingTidEkstra plassHvorfor
Rekursjon med delstreng()O(nยฒ)O(nยฒ)substring() kopierer de gjenvรฆrende tegnene pรฅ hvert kall, og รฉn stakkramme holdes per tegn
for-lรธkke med charAt() og +O(nยฒ)O(nยฒ)Hver sammenkobling tildeler en ny streng og kopierer alt som er samlet inn sรฅ langt.
StringBuilder.reverse()O (n)O (n)ร‰n muterbar buffer, รฉn passasje og surrogatpar holdes intakte
To pekere over tilCharArray()O (n)O (n)ร‰n arraykopi, deretter n/2 bytter uten ytterligere allokering

Velg den rekursive versjonen for รฅ lรฆre eller demonstrere hvordan kallstakken oppfรธrer seg, char-array-versjonen nรฅr en intervjuer ber om logikken manuelt, og StringBuilder.reverse() i alt som sendes. Den samme avveiningen mellom en undervisningslรธsning og en produksjonslรธsning dukker opp pรฅ tvers av de klassiske รธvelsene, fra boblesortering og Fibonacci-serien til primtallssjekker; hver enkelt er verdt รฅ รธve pรฅ Java begge veier.

Spรธrsmรฅl og svar

Stringobjekter er uforanderlige, sรฅ tegnene i et objekt kan aldri endres etter opprettelse. Hver reversering bygger derfor et nytt objekt. Bruk StringBuilder eller en char-array nรฅr tegnene mรฅ endres uten รฅ tildele en ny streng i hvert trinn.

Det fรธrste kallet til isEmpty() kaster en NullPointerException, fordi metoden kalles pรฅ ingenting. Beskytt inngangspunktet med en null-sjekk som returnerer null eller kaster IllegalArgumentException fรธr noen rekursjon starter.

Ikke pรฅlitelig. charAt() fungerer pรฅ 16-bits kodeenheter, slik at et tegn lagret som et surrogatpar deles og den reverserte teksten viser erstatningskvadrater. StringBuilder.reverse() holder surrogatpar sammen, noe som gjรธr det til et tryggere valg for Unicode-tekst.

StringBuilder, i nesten alle tilfeller. Begge eksponerer den samme reverse()-metoden, men StringBuffer synkroniserer hver samtale, noe som koster fart. Velg StringBuffer bare nรฅr รฉn buffer genuint deles mellom trรฅder.

Del setningen pรฅ mellomrom med split(" "), og gรฅ deretter den resulterende tabellen fra den siste indeksen til den fรธrste, og legg til hvert ord i en StringBuilder. Tegnene i hvert ord forblir i sin opprinnelige rekkefรธlge.

ร‰n stakkramme brukes per tegn, sรฅ noen fรฅ tusen tegn er typisk fรธr en StackOverflowError vises. Den nรธyaktige grensen avhenger av JVM-trรฅdstakkens stรธrrelse. Enhver iterativ versjon unngรฅr taket fullstendig.

En AI-assistent kan lese en stabel trace.g. peker pรฅ et manglende eller utilgjengelig basistilfelle, og forklarer rekkefรธlgen rammer avvikles i. Den utarbeider ogsรฅ kanttilfelletester for tom, enkelttegns- og null-input. Bekreft resonnementet mot en reell kjรธring.

Ja. copilot fullfรธrer vanligvis en hel revers metode bare fra signaturen, og tilbyr ofte StringBuilder-formen fรธrst. Sjekk basistilfellet og kompleksiteten, fordi det korteste forslaget ikke alltid er den versjonen en รธvelse ber om.

Oppsummer dette innlegget med: