Miten Reverse merkkijono sisään Java Recursion avulla

⚡ Älykäs yhteenveto

Revnarun syöttäminen sisään Java rekursiossa ensimmäinen merkki poistetaan, jäljelle jäänyt merkkijono käännetään ja ensimmäinen merkki lisätään loppuun. Tyhjä merkkijono pysäyttää kutsut ja purkaa pinon.

  • 🔘 Perustapaus: Metodi palauttaa heti, kun isEmpty() ilmoittaa, ettei mitään peruutettavaa ole jäljellä.
  • ☑️ Rekursiivinen askel: substring(1) poistaa ensimmäisen merkin ja charAt(0) sijoittaa sen takaisin käänteisen jakojäännöksen jälkeen.
  • muuttumattomuudesta: Jokainen kutsu luo uuden String-objektin, koska Java Merkkijonoa ei voi koskaan muokata paikallaan.
  • 🧪 Trace: Guru99 muuttuu muotoon 99uruG seitsemän kutsun jälkeen, yksi kutakin merkkiä ja tyhjän perustapauksen jälkeen.
  • 🛠️ Nopeammat vaihtoehdot: StringBuilder.reverse() ja kahden osoittimen vaihto funktioon toCharArray() molemmat päättyvät yhdellä kertaa.
  • 📌 Kustannukset: Rekursio substring()-funktiolla suoritetaan kvadraattisessa ajassa ja sisältää yhden pinokehyksen merkkiä kohden.

Java ohjelma, joka kääntää merkkijonon käänteiseksi rekursiivisella menetelmällä

Tässä esimerkkiohjelmassa käännämme käyttäjän syöttämän merkkijonon.

Luomme funktion merkkijonon kääntämiseksi. Later Kutsumme sitä rekursiivisesti, kunnes kaikki merkit ovat päinvastaiset. Rekursio sopii tähän ongelmaan, koska käänteinen merkkijono on yksinkertaisesti merkkijonon käänteinen häntä, jonka alkuperäinen ensimmäinen merkki on jumissa lopussa, mikä on sama ongelma yhtä merkkiä pienempänä.

Kirjoittaa Java Ohjelma kohteeseen Reverse jono

Alla oleva luokka määrittelee syötteen main()-funktiossa, antaa sen reverseString()-funktiolle ja tulostaa vastauksen. Kaksi println()-kutsua metodin sisällä tekevät jokaisen rekursiivisen vaiheen näkyväksi konsolissa.

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 lähtö:

Jokainen tulosteen rivi on yksi rekursiivinen kutsu. Jokaisella rivillä tulostettu häntä on yhden merkin lyhyempi kuin sitä edeltävä rivi, ja viimeisellä rivillä näkyy käänteinen tulos.

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

Miten rekursiivinen Reversal toimii askel askeleelta

Koko metodi sisältää kaksi riviä. Perustapauksessa if (myStr.isEmpty()) antaa rekursion lopetuskohdan. Rekursiivinen rivi, return reverseString(myStr.substring(1)) + myStr.charAt(0), jakaa työn kahteen osaan: substring(1) on kaikki ensimmäisen merkin jälkeen ja charAt(0) on tuo ensimmäinen merkki, lisättynä siihen. jälkeen käänteinen jäännös.

Tracsyötteen Guru99 tekee järjestyksen selväksi. Java työntää yhden kehyksen jokaista kutsua kohden ennen ketjutusta:

PuhelumyStrSiirretty seuraavaan puheluunIlme odottaa valmistumista
1Guru99uru99käänteinen merkkijono(“uru99”) + G
2uru99ru99käänteinen merkkijono(“ru99”) + u
3ru99u99käänteinen merkkijono("u99") + r
4u9999käänteinenMerkkijono("99") + u
5999käänteinenMerkkijono("9") + 9
69(tyhjä)käänteinenMerkkijono("") + 9
7(tyhjä)perustapaus saavutettupalauttaa tyhjän merkkijonon

Pino purkautuu sitten alhaalta ylöspäin, ja jokainen kehys lisää tallennetun merkkinsä: tyhjästä merkkijonosta tulee ensin 9, sitten 99, sitten 99u, 99ur, 99uru ja lopuksi 99uruG. Koska Java merkkijonot ovat muuttumattomia, mikään näistä väliarvoista ei korvaa edellistä — jokainen ketjutus allokoi uuden String-objektin.

Kaksi konsolin tulosteen yksityiskohtaa on mainitsemisen arvoisia. Kuudes rivi päättyy tyhjään kaksoispisteen jälkeen, koska substring(1) yksimerkkisellä merkkijonolla palauttaa tyhjän merkkijonon null-arvon sijaan. Seuraava viesti kuuluu alkuperäisessä ohjelmassa "Merkkijono on nyt tyhjä"; sanamuoto on kirjoitusvirhe "Merkkijono on nyt tyhjä" -viestille eikä sitä ole muutettu, joten koodi ja tuloste vastaavat edelleen rivi riviltä.

Muita tapoja Reverse merkkijono sisään Java

Rekursio on selkein tapa nähdä Käänteinen toiminta tapahtuu, mutta se tapahtuu harvoin samalla tavalla kuin tuotantokoodi. Kolme vaihtoehtoa kattavat lähes kaikki todelliset tapaukset.

1. StringBuilder.reverse() on lyhin ja nopein. Luokassa on sisäänrakennettu reverse()-metodi, joten koko työ mahtuu yhdelle riville:

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

2. for-silmukka charAt()-funktiolla kulkee merkkijonon läpi taaksepäin viimeisestä indeksistä nollaan. Haastattelijat usein kysyvät tätä versiota, koska se näyttää logiikan delegoinnin sijaan:

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

3. Kahden osoittimen vaihto CharArray()-funktioon muuntaa merkkijonon char-taulukoksi ja vaihtaa sitten uloimmat merkit sisäänpäin, kunnes osoittimet kohtaavat keskellä:

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 taulukkotekniikka kääntää numeerisen jonon tai minkä tahansa muun järjestetyn kokoelman päinvastaiseksi, minkä vuoksi se esiintyy Java ryhmä harjoituksia yhtä usein kuin jousiharjoituksissa.

Kunkin lähestymistavan aika- ja paikkakompleksisuus

Neljä versiota eivät maksa samaa summaa. Molemmilla alla olevilla toisen asteen funktioilla on yksi yhteinen syy: ne luovat jokaisella askeleella aivan uuden merkkijonon, ja n merkin kopioiminen n kertaa on n kertaan korotettua työtä.

LähestymistapaAika:LisätilaaMiksi
Rekursio substring()-funktiollaO(n²)O(n²)substring() kopioi jäljellä olevat merkit jokaisella kutsukerralla, ja yksi pinokehys säilytetään merkkiä kohden
for-silmukka, jossa on charAt() ja +O(n²)O(n²)Jokainen ketjutus varaa uuden merkkijonon ja kopioi kaiken siihen mennessä kerätyn
StringBuilder.reverse()O (n)O (n)Yksi muokattava puskuri, yksi läpikulku ja sijaisparit pidetään ehjinä
Kaksi osoitinta CharArray()-funktion yliO (n)O (n)Yksi taulukon kopio, sitten n/2 vaihtoa ilman lisäallokointia

Valitse rekursiivinen versio oppiaksesi tai havainnollistaaksesi kutsupinon toimintaa, char-array-versio, kun haastattelija kysyy logiikkaa käsin, ja StringBuilder.reverse() kaikissa toimitettavissa ratkaisuissa. Sama kompromissi opetusratkaisun ja tuotantoratkaisun välillä näkyy kaikissa klassisissa harjoituksissa, alkaen kupla ja Fibonacci sarja että alkulukutarkistukset; jokainen niistä on harjoittelun arvoinen Java molempiin suuntiin.

UKK

Merkkijono-objektit ovat muuttumattomia, joten niiden sisällä olevat merkit eivät voi koskaan muuttua luomisen jälkeen. Jokainen peruutus luo siis uuden objektin. Käytä StringBuilderia tai char-taulukkoa, kun merkkejä on muokattava varaamatta uutta merkkijonoa jokaisessa vaiheessa.

Ensimmäinen isEmpty()-kutsu heittää NullPointerException-poikkeuksen, koska metodia kutsutaan tyhjästä. Suojaa aloituskohta null-tarkistuksella, joka palauttaa null-arvon, tai heittää IllegalArgumentException-poikkeuksen ennen rekursion alkamista.

Ei luotettavasti. charAt() toimii 16-bittisillä koodiyksiköillä, joten sijaisparina tallennettu merkki jaetaan ja käänteinen teksti näyttää korvaavat neliöt. StringBuilder.reverse() pitää sijaisparit yhdessä, mikä tekee siitä turvallisemman vaihtoehdon Unicode-tekstille.

StringBuilder lähes kaikissa tapauksissa. Molemmat käyttävät samaa reverse()-metodia, mutta StringBuffer synkronoi jokaisen puhelun, mikä maksaa nopeutta. Valitse MerkkijonoBuffer vain silloin, kun yksi puskuri on aidosti jaettu säikeiden kesken.

Jaa lause välilyöntien päälle funktiolla split(” “) ja kävele sitten tuloksena olevassa taulukossa viimeisestä indeksistä ensimmäiseen, liittäen jokaisen sanan StringBuilderiin. Kunkin sanan sisällä olevat merkit pysyvät alkuperäisessä järjestyksessään.

Merkkiä kohden käytetään yhtä pinokehystä, joten muutama tuhat merkkiä on tyypillistä ennen StackOverflowError-virheen ilmestymistä. Tarkka raja riippuu JVM-säikeiden pinon koosta. Kaikissa iteratiivisissa versioissa vältetään katto kokonaan.

Tekoälyavustaja voi lukea pinoa trace., osoita puuttuva tai saavuttamaton perustapaus ja selitä kehysten purkautumisjärjestys. Se myös laatii reunatapaustestejä tyhjälle, yhden merkin ja null-syötteelle. Tarkista päättely todellista suoritusta vasten.

Kyllä. Lentoperämies yleensä suorittaa kokonaisen käänteisen metodin pelkästään allekirjoituksesta alkaen ja tarjoaa usein ensin StringBuilder-muotoa. Tarkista perustapaus ja monimutkaisuus, koska lyhin ehdotus ei aina ole harjoituksen pyytämä versio.

Tiivistä tämä viesti seuraavasti: