kuidas Reverse string sees Java kasutades rekursiooni

⚡ Nutikas kokkuvõte

Revnööri sisse panemine Java Rekursiooni puhul kooritakse esimene märk maha, ülejäänud pööratakse ümber ja esimene märk lisatakse lõppu. Tühi string peatab väljakutsed ja harutab pinu lahti.

  • 🔘 Põhijuhtum: Meetod tagastab koheselt, kui isEmpty() teatab, et tagasipööramiseks pole midagi enam jäänud.
  • ☑️ Rekursiivne samm: substring(1) eemaldab esimese märgi ja charAt(0) paneb selle tagasi pärast ümberpööratud jääki.
  • Parandamatus: Iga kutse loob uue String-objekti, sest a Java Stringi ei saa kunagi kohapeal muuta.
  • 🧪 Trace: GuruPärast seitset kutset (üks iga märgi ja tühja baasjuhtumi jaoks) saab 99-st 99uruG.
  • 🛠️ Kiiremad valikud: StringBuilder.reverse() ja kahepunktiline vahetus funktsiooni toCharArray() üle lõpevad mõlemad ühe läbimisega.
  • 📌 Hind: Funktsiooniga substring() teostatav rekursioon on ruutkeskmine ja sisaldab iga tähe kohta ühte pinukaadrit.

Java programm, mis pöörab stringi rekursiivse meetodi abil ümber

Selles näidisprogrammis pöörame kasutaja sisestatud stringi ümber.

Loome funktsiooni stringi ümberpööramiseks. Later Me nimetame seda rekursiivselt seni, kuni kõik märgid on vastupidised. Rekursioon sobib sellele probleemile, sest vastupidine string on lihtsalt stringi vastupidine saba, mille lõppu on kleebitud algne esimene märk, mis on sama probleem ühe märgi võrra väiksemana.

Kirjuta Java Programmeerida Reverse nöör

Allolev klass deklareerib sisendi funktsioonis main(), annab selle funktsioonile reverseString() ja kuvab vastuse. Kaks meetodi sees olevat println() käsku muudavad iga rekursiivse sammu konsoolis nähtavaks.

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 Väljund:

Iga väljundi rida on üks rekursiivne kutse. Igal real trükitud saba on ühe märgi võrra lühem kui ülemine rida ja viimane rida näitab vastupidist tulemust.

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

Kuidas rekursiivne Reversal töötab samm-sammult

Kogu meetod sisaldab kahte rida. Baasjuhul, kui (myStr.isEmpty()), antakse rekursioonile peatumiskoht. Rekursiivne rida, return reverseString(myStr.substring(1)) + myStr.charAt(0), jagab töö kaheks: substring(1) on kõik pärast esimest märki ja charAt(0) on see esimene märk, millele on lisatud. pärast vastupidine jääk.

Tracsisendi sisestamine Guru99 teeb järjekorra selgeks. Java lükkab iga kutse kohta ühe kaadri enne liitmist:

HelistaminuStrEdasi järgmisele kõneleVäljend ootab lõpetamist
1Guru99uru99vastupidine string("uru99") + G
2uru99ru99vastupidine string("ru99") + u
3ru99u99vastupidine string("u99") + r
4u9999vastupidine string("99") + u
5999vastupidine string("9") + 9
69(tühi)vastupidine string("") + 9
7(tühi)baasstsenaarium saavutatudtagastab tühja stringi

Seejärel harutatakse pinu alt ülespoole lahti ja iga kaader lisab oma salvestatud märgi: tühjast stringist saab 9, seejärel 99, siis 99u, 99ur, 99uru ja lõpuks 99uruG. Sest Java stringid on muutumatud, ükski neist vaheväärtustest ei kirjuta eelmist üle — iga liitmine eraldab uue String-objekti.

Konsooli väljundis väärivad nimetamist kaks detaili. Kuues rida lõpeb pärast koolonit tühja reaga, kuna ühetähemärgilise stringi substring(1) tagastab tühja stringi, mitte nulli. Järgnev teade on algses programmis „String on nüüd tühi”; sõnastus on „String on nüüd tühi” asemel trükiviga ja seda on muutmata, seega ülaltoodud kood ja väljund vastavad endiselt rida-realt.

Muud viisid Reverse string sees Java

Rekursioon on kõige selgem viis vaata Pöördumine toimub, kuid harva tehakse seda nii, nagu tootmiskood seda teeb. Kolm alternatiivi hõlmavad peaaegu iga reaalset juhtumit.

1. StringBuilder.reverse() on lühim ja kiireim. Klassil on sisseehitatud reverse() meetod, seega mahub kogu töö ühele reale:

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

2. A for-tsükkel funktsiooniga charAt() käib stringis tagasi viimasest indeksist nullini. Intervjueerijad küsivad sageli seda versiooni, sest see näitab loogikat selle delegeerimise asemel:

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

3. Kahe osutiga objekti vahetus funktsioonile CharArray() teisendab stringi char-massiiviks ja seejärel vahetab äärmised märgid sissepoole, kuni pointerid kohtuvad keskel:

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

Sama massiivitehnika pöörab numbrilise jada või mis tahes muu järjestatud kogumi ümber, mistõttu see kuvatakse Java massiivi harjutusi sama tihti kui keelpillidega harjutusi.

Iga lähenemisviisi ajaline ja ruumiline keerukus

Need neli versiooni ei maksa sama palju. Mõlemal alloleval ruutülesandel on üks ja sama põhjus: need loovad igal sammul täiesti uue stringi ja n tähemärgi n korda kopeerimine on n ruudus töö.

LähenemineaegLisaruumiMiks
Rekursioon funktsiooniga substring()O(n²)O(n²)substring() kopeerib iga kutse käigus ülejäänud tähemärgid ja iga tähemärgi kohta hoitakse ühte pinu kaadrit
tsükli jaoks, kus on charAt() ja +O(n²)O(n²)Iga liitmine eraldab uue stringi ja kopeerib kõik seni kogutud.
StringBuilder.reverse()O (n)O (n)Üks muudetav puhver, üks läbimine ja asenduspaarid hoitakse puutumata
Kaks pointerit funktsiooni toCharArray() kohaleO (n)O (n)Üks massiivi koopia, seejärel n/2 vahetust ilma edasise eraldamiseta

Valige rekursiivne versioon õppimiseks või väljakutsete pinu käitumise demonstreerimiseks, tähestikuline massiiviversioon, kui intervjueerija küsib loogikat käsitsi, ja StringBuilder.reverse() kõiges, mis tarnitakse. Sama kompromiss õpetamislahenduse ja tootmislahenduse vahel ilmneb kõigis klassikalistes harjutustes, alates mulli sorteerimine ja Fibonacci seeria et algarvude kontrollidigaüks neist on harjutamist väärt; Java mõlemas suunas.

KKK

String-objektid on muutmatud, seega nende sees olevad tähemärgid ei saa pärast loomist enam kunagi muutuda. Iga ümberpööramine loob seega uue objekti. Kasutage StringBuilderit või tähemärkide massiivi, kui märke tuleb muuta ilma iga sammu jaoks uut stringi eraldamata.

Esimene isEmpty() kutse viskab NullPointerExceptioni, kuna meetodit kutsutakse välja mitte millegi puhul. Enne rekursiooni algust kaitske sisenemispunkti nullkontrolliga, mis tagastab nulli, või IllegalArgumentExceptioni.

Mitte usaldusväärne. charAt() töötab 16-bitiste koodiühikutega, seega asenduspaarina salvestatud märk jagatakse ja ümberpööratud tekst näitab asendusruute. StringBuilder.reverse() hoiab asenduspaarid koos, mis teeb sellest Unicode-teksti jaoks turvalisema valiku.

StringBuilder peaaegu igal juhul. Mõlemad kasutavad sama reverse() meetodit, aga StringBuffer sünkroonib iga kõne, mis maksab kiirust. Valige stringBuffer ainult siis, kui üks puhver on lõimede vahel tõeliselt jagatud.

Jaota lause tühikute järgi funktsiooniga split(””) ja seejärel liigu saadud massiivis viimasest indeksist esimeseni, lisades iga sõna StringBuilderile. Iga sõna sees olevad tähemärgid jäävad oma algsesse järjekorda.

Iga tähemärgi kohta kasutatakse ühte pinu kaadrit, seega on StackOverflowErrori ilmumiseni tavaliselt vaja paar tuhat tähemärki. Täpne piirang sõltub JVM-i lõime pinu suurusest. Iga iteratiivne versioon väldib ülemmäära täielikult.

Tehisintellekti assistent saab lugeda virna trace, osutage puuduvale või kättesaamatule baasjuhtumile ja selgitage kaadrite lahtikerimise järjekorda. Samuti koostatakse äärejuhtude testid tühja, ühe märgiga ja null-sisendi jaoks. Kontrollige arutluskäiku reaalse käivitamise suhtes.

Jah. Copilot tavaliselt lõpetab terve vastupidise meetodi ainuüksi signatuuri põhjal, pakkudes sageli esmalt StringBuilderi vormi. Kontrollige baasjuhtu ja keerukust, sest lühim soovitus ei ole alati see versioon, mida harjutus küsib.

Võta see postitus kokku järgmiselt: