Як записатися Reverse рядок у Java за допомогою рекурсії
⚡ Розумний підсумок
Revзаміна рядка в Java Рекурсія працює шляхом видалення першого символу, звернення залишків на зворотне місце та додавання цього першого символу в кінець. Порожній рядок зупиняє виклики та розмотує стек.
У цьому прикладі програми ми перевернемо рядок, введений користувачем.
Ми створимо функцію для звернення рядка. Later Ми будемо викликати це рекурсивно, доки всі символи не будуть перевернуті. Рекурсія підходить для цієї задачі, оскільки обернутий рядок — це просто обернутий хвіст рядка з початковим першим символом, застряглим на кінці, що є тією ж задачею, але на один символ менше.
Написати Java Програма для Reverse рядок
Клас нижче оголошує вхідні дані в main(), передає їх до reverseString() та друкує те, що повертається. Два виклики println() всередині методу роблять кожен рекурсивний крок видимим у консолі.
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 вихід:
Кожен рядок виводу є одним рекурсивним викликом. Хвіст, виведений у кожному рядку, на один символ коротший за рядок над ним, а останній рядок показує зворотний результат.
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
Як рекурсивний Reversal працює крок за кроком
Два рядки містять весь метод. Базовий випадок, if (myStr.isEmpty()), вказує на місце, де рекурсія має зупинитися. Рекурсивний рядок return reverseString(myStr.substring(1)) + myStr.charAt(0) розділяє роботу на дві частини: substring(1) — це все після першого символу, а charAt(0) — це цей перший символ, доданий до нього. після обернений залишок.
Tracвведення Guru99 чітко визначає порядок. Java перед кожним викликом надсилає один кадр, перш ніж відбудеться будь-яке об'єднання:
| виклик | myStr | Переведено на наступний виклик | Вираз очікує завершення |
|---|---|---|---|
| 1 | Guru99 | уру99 | зворотнийРядок(“uru99”) + G |
| 2 | уру99 | ru99 | зворотнийРядок(“ru99”) + u |
| 3 | ru99 | u99 | зворотнийРядок(“u99”) + r |
| 4 | u99 | 99 | зворотнийРядок("99") + u |
| 5 | 99 | 9 | зворотнийРядок("9") + 9 |
| 6 | 9 | (порожній) | зворотнийРядок("") + 9 |
| 7 | (порожній) | базовий сценарій досягнуто | повертає порожній рядок |
Потім стек розмотується знизу вгору, і кожен кадр додає свій збережений символ: порожній рядок стає 9, потім 99, потім 99u, 99ur, 99uru і, нарешті, 99uruG. Оскільки Java Рядки незмінні, жодне з цих проміжних значень не перезаписує попереднє — кожне об'єднання виділяє новий об'єкт String.
Варто згадати дві деталі у виводі консолі. Шостий рядок закінчується нічим після двокрапки, оскільки substring(1) для односимвольного рядка повертає порожній рядок, а не null. Наступне повідомлення в оригінальній програмі має вигляд «String in now Empty» (Рядок тепер порожній); це формулювання є друкарською помилкою для «String is now empty» (Рядок тепер порожній) і залишилося недоторканим, тому код і наведений вище вивід все ще збігаються рядок за рядком.
Інші способи Reverse рядок у Java
Рекурсія — це найзрозуміліший спосіб побачити Зворотне виконання відбувається, але це рідко відбувається у виробничому коді. Три альтернативи охоплюють майже кожен реальний випадок.
1. StringBuilder.reverse() є найкоротшим і найшвидшим. Клас має вбудований метод reverse(), тому все завдання поміщається в один рядок:
String reversed = new StringBuilder(myStr).reverse().toString();
2. Цикл for з charAt() переглядає рядок у зворотному порядку від останнього індексу до нуля. Інтерв'юери часто запитують цю версію, оскільки вона показує логіку, а не делегує її:
String reversed = ""; for (int i = myStr.length() - 1; i >= 0; i--) { reversed = reversed + myStr.charAt(i); }
3. Двовказівковий обмін значеннями методом toCharArray() перетворює рядок на масив символів, потім міняє крайні символи всередину, доки вказівники не зустрінуться посередині:
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);
Той самий метод масивів перевертає числову послідовність або будь-яку іншу впорядковану колекцію, тому він і з'являється в Java масив вправи так само часто, як і у струнних.
Часова та просторова складність кожного підходу
Чотири версії коштують не однаково. Обидва квадратичні записи нижче мають одну спільну причину: вони створюють абсолютно новий рядок на кожному кроці, а копіювання n символів n разів — це n квадратичних операцій.
| Підхід | Time | Додатковий простір | Чому |
|---|---|---|---|
| Рекурсія з підрядком() | O (n²) | O (n²) | substring() копіює решту символів під час кожного виклику, і один стековий кадр зберігається на кожен символ. |
| цикл for з charAt() та + | O (n²) | O (n²) | Кожне об'єднання виділяє новий рядок (String) та копіює все, що зібрано на даний момент. |
| StringBuilder.reverse() | О (п) | О (п) | Один змінний буфер, один прохід та сурогатні пари зберігаються недоторканими |
| Два вказівники на toCharArray() | О (п) | О (п) | Одна копія масиву, потім n/2 обмінів без подальшого розподілу |
Виберіть рекурсивну версію, щоб вивчити або продемонструвати, як поводиться стек викликів, версію з символьним масивом, коли інтерв'юер запитує логіку вручну, та StringBuilder.reverse() у будь-якому постачальнику. Той самий компроміс між навчальним рішенням та рішенням для виробництва проявляється у класичних вправах, від сортування бульбашками і Серія Фібоначчі до перевірки простих чисел; кожен з них вартий практики Java в обидва боки.
