КАК 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ввод GuruЧисло 99 делает порядок ясным. Java Перед конкатенацией кадров добавляется один кадр для каждого вызова:
| Позвонить | myStr | Передано следующему вызову | Выражение лица, ожидающее завершения |
|---|---|---|---|
| 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 | (Пусто) | reverseString(“”) + 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.
| Подход | Дата | Дополнительное пространство | Почему |
|---|---|---|---|
| Рекурсия с использованием функции substring() | O (n²) | O (n²) | Функция substring() копирует оставшиеся символы при каждом вызове, и для каждого символа хранится один кадр стека. |
| Цикл for с использованием charAt() и + | O (n²) | O (n²) | При каждой конкатенации создается новая строка, и копируются все собранные к этому моменту данные. |
| StringBuilder.reverse() | О (п) | О (п) | Один изменяемый буфер, один проход, и суррогатные пары остаются неизменными. |
| Два указателя на CharArray() | О (п) | О (п) | Одно копирование массива, затем n/2 обменов без дальнейшего выделения памяти. |
Для изучения или демонстрации поведения стека вызовов выбирайте рекурсивную версию, если интервьюер просит объяснить логику вручную, а для использования StringBuilder.reverse() — любой стандартный метод. Тот же компромисс между учебным и производственным решением наблюдается во всех классических упражнениях, начиная с... пузырьковая сортировка и Серия Фибоначчи в проверка простых чисел; каждый из них заслуживает практики в Java обе стороны.
