Come Reverse una stringa in Java utilizzando la ricorsione
โก Riepilogo intelligente
Revinserendo una stringa in Java La ricorsione funziona rimuovendo il primo carattere, invertendo ciรฒ che rimane e aggiungendo quel primo carattere alla fine. Una stringa vuota interrompe le chiamate e svuota lo stack.
In questo programma esempio, invertiremo una stringa inserita da un utente.
Creeremo una funzione per invertire una stringa. Later Lo richiameremo ricorsivamente finchรฉ tutti i caratteri non saranno invertiti. La ricorsione si adatta a questo problema perchรฉ una stringa invertita รจ semplicemente la coda invertita della stringa con il primo carattere originale attaccato alla fine, che รจ lo stesso problema con un carattere in meno.
Scrivi a Java Programma per Reverse Corda
La classe seguente dichiara l'input nel metodo main(), lo passa al metodo reverseString() e stampa il risultato. Due chiamate a println() all'interno del metodo rendono visibile nella console ogni passaggio ricorsivo.
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 Produzione:
Ogni riga dell'output rappresenta una chiamata ricorsiva. La parte finale stampata su ogni riga รจ piรน corta di un carattere rispetto alla riga precedente, e l'ultima riga mostra il risultato invertito.
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
Come il ricorsivo RevOpere universali passo dopo passo
Due righe contengono l'intero metodo. Il caso base, if (myStr.isEmpty()), fornisce alla ricorsione un punto in cui fermarsi. La riga ricorsiva, return reverseString(myStr.substring(1)) + myStr.charAt(0), divide il lavoro in due: substring(1) รจ tutto ciรฒ che segue il primo carattere e charAt(0) รจ quel primo carattere, aggiunto dopo il resto invertito.
Tracl'input GuruIl numero 99 chiarisce l'ordine. Java invia un frame per ogni chiamata prima che avvenga qualsiasi concatenazione:
| Bando | myStr | Passato alla chiamata successiva | Espressione in attesa di terminare |
|---|---|---|---|
| 1 | Guru99 | uru99 | reverseString(โuru99โ) + G |
| 2 | uru99 | ru99 | reverseString("ru99") + u |
| 3 | ru99 | u99 | reverseString(โu99โ) + r |
| 4 | u99 | 99 | reverseString("99") + u |
| 5 | 99 | 9 | reverseString(โ9โ) + 9 |
| 6 | 9 | (Vuoto) | reverseString(โโ) + 9 |
| 7 | (Vuoto) | caso base raggiunto | restituisce la stringa vuota |
Lo stack si srotola quindi dal basso verso l'alto e ogni frame aggiunge il suo carattere salvato: la stringa vuota diventa 9, poi 99, poi 99u, 99ur, 99uru e infine 99uruG. Perchรฉ Java Le stringhe sono immutabili, nessuno di questi valori intermedi sovrascrive quello precedente: ogni concatenazione alloca un nuovo oggetto String.
Due dettagli nell'output della console meritano di essere menzionati. La sesta riga termina senza nulla dopo i due punti, perchรฉ la funzione substring(1) su una stringa di un solo carattere restituisce la stringa vuota anzichรฉ null. Il messaggio che segue nel programma originale recita "String in now Empty"; la formulazione รจ un errore di battitura per "String is now empty" ed รจ stata lasciata invariata in modo che il codice e l'output sopra riportato corrispondano ancora riga per riga.
Altri modi per Reverse una stringa in Java
La ricorsione รจ il modo piรน chiaro per vedere L'inversione puรฒ avvenire, ma raramente avviene nel modo in cui il codice di produzione la gestisce. Tre alternative coprono quasi tutti i casi reali.
1. StringBuilder.reverse() รจ la piรน breve e la piรน veloce. La classe include un metodo reverse() integrato, quindi l'intera operazione sta in una sola riga:
String reversed = new StringBuilder(myStr).reverse().toString();
2. Un ciclo for con charAt() Percorre la stringa a ritroso dall'ultimo indice fino a zero. I selezionatori spesso richiedono questa versione perchรฉ mostra la logica invece di delegarla:
String reversed = ""; for (int i = myStr.length() - 1; i >= 0; i--) { reversed = reversed + myStr.charAt(i); }
3. Uno scambio di due puntatori su toCharArray() converte la stringa in un array di caratteri, quindi scambia i caratteri piรน esterni con quelli piรน interni finchรฉ i puntatori non si incontrano al centro:
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);
La stessa tecnica di array inverte una sequenza numerica o qualsiasi altra collezione ordinata, motivo per cui compare in Java schieramento esercizi con la stessa frequenza di quelli con la corda.
Complessitร temporale e spaziale di ciascun approccio.
Le quattro versioni non hanno lo stesso costo. Entrambe le voci quadratiche qui sotto hanno una causa comune: creano una stringa completamente nuova a ogni passaggio, e copiare n caratteri n volte richiede un lavoro pari a n al quadrato.
| Approccio | Ora | Spazio extra | Perchรฉ |
|---|---|---|---|
| Ricorsione con substring() | O(nยฒ) | O(nยฒ) | La funzione substring() copia i caratteri rimanenti ad ogni chiamata e per ogni carattere viene mantenuto un frame dello stack. |
| ciclo for con charAt() e + | O(nยฒ) | O(nยฒ) | Ogni concatenazione alloca una nuova stringa e copia tutto ciรฒ che รจ stato raccolto finora |
| StringBuilder.reverse() | O (n) | O (n) | Un buffer modificabile, un passaggio e le coppie surrogate rimangono intatte |
| Due puntatori a toCharArray() | O (n) | O (n) | Una copia dell'array, poi n/2 scambi senza ulteriore allocazione |
Scegli la versione ricorsiva per imparare o per dimostrare come si comporta lo stack di chiamate, la versione con array di caratteri quando un intervistatore chiede la logica a mano e StringBuilder.reverse() in qualsiasi versione distribuita. Lo stesso compromesso tra una soluzione didattica e una di produzione si presenta in tutti gli esercizi classici, da ordinamento a bolle e Serie di Fibonacci a controlli dei numeri primi; vale la pena praticare ciascuno di essi Java in entrambi i sensi.
