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.
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:
| Anrop | minStr | Overfรธrt til neste samtale | Uttrykk venter pรฅ รฅ bli ferdig |
|---|---|---|---|
| 1 | Guru99 | uru99 | reverseString(โuru99โ) + G |
| 2 | uru99 | ru99 | reverseString(โru99โ) + u |
| 3 | ru99 | u99 | reversString(โu99โ) + r |
| 4 | u99 | 99 | reversString("99") + u |
| 5 | 99 | 9 | reversString("9") + 9 |
| 6 | 9 | (tรธmme) | reversString(โโ) + 9 |
| 7 | (tรธmme) | basisscenariet er nรฅdd | returnerer 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รฆrming | Tid | Ekstra plass | Hvorfor |
|---|---|---|---|
| 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.
