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.
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:
| Puhelu | myStr | Siirretty seuraavaan puheluun | Ilme odottaa valmistumista |
|---|---|---|---|
| 1 | Guru99 | uru99 | käänteinen merkkijono(“uru99”) + G |
| 2 | uru99 | ru99 | käänteinen merkkijono(“ru99”) + u |
| 3 | ru99 | u99 | käänteinen merkkijono("u99") + r |
| 4 | u99 | 99 | käänteinenMerkkijono("99") + u |
| 5 | 99 | 9 | käänteinenMerkkijono("9") + 9 |
| 6 | 9 | (tyhjä) | käänteinenMerkkijono("") + 9 |
| 7 | (tyhjä) | perustapaus saavutettu | palauttaa 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ähestymistapa | Aika: | Lisätilaa | Miksi |
|---|---|---|---|
| Rekursio substring()-funktiolla | O(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 yli | O (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.
