КАК Reverse строка в Java использование рекурсии

⚡ Умное резюме

Revперестановка строки в Java Рекурсия работает следующим образом: удаляется первый символ, оставшиеся символы переворачиваются, и первый символ добавляется в конец. Пустая строка останавливает вызовы и разматывает стек.

  • 🔘 Базовый вариант: Метод немедленно возвращает управление, когда метод isEmpty() сообщает, что ничего не осталось для отмены.
  • ☑️ Рекурсивный шаг: substring(1) удаляет первый символ, а charAt(0) возвращает его после перевернутого остатка.
  • Неизменность: Каждый вызов создает новый объект String, потому что Java Строку невозможно отредактировать на месте.
  • 🧪 Trace: GuruПосле семи вызовов, по одному для каждого символа плюс пустой базовый регистр, число 99 превращается в 99uruG.
  • 🇧🇷 Более быстрые варианты: Выполнение StringBuilder.reverse() и обмен двумя указателями в toCharArray() завершаются за один проход.
  • 📌 Стоимость: Рекурсия с использованием функции substring() выполняется за квадратичное время и удерживает один кадр стека на каждый символ.

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Передано следующему вызовуВыражение лица, ожидающее завершения
1Guru99uru99reverseString(“uru99”) + G
2uru99ru99reverseString(“ru99”) + u
3ru99u99reverseString(“u99”) + r
4u9999reverseString(“99”) + u
5999reverseString(“9”) + 9
69(Пусто)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 обе стороны.

Часто задаваемые вопросы (FAQ)

Строковые объекты неизменяемы, поэтому символы внутри них никогда не могут измениться после создания. Следовательно, каждое изменение порядка символов приводит к созданию нового объекта. Используйте StringBuilder или массив символов, когда необходимо изменить символы без создания новой строки на каждом шаге.

Первый вызов метода isEmpty() вызывает исключение NullPointerException, поскольку метод вызывается для пустого места. Перед началом рекурсии следует защитить точку входа проверкой на null, которая возвращает null или вызывает исключение IllegalArgumentException.

Ненадёжно. Функция charAt() работает с 16-битными кодовыми единицами, поэтому символ, хранящийся в виде суррогатной пары, разделяется, и в перевёрнутом тексте отображаются заменяющие квадраты. StringBuilder.reverse() сохраняет суррогатные пары вместе, что делает его более безопасным выбором для текста в формате Unicode.

В большинстве случаев используется StringBuilder. Оба класса предоставляют один и тот же метод reverse(), но StringBuilder — единственный.Buffer Синхронизирует каждый вызов, что снижает скорость. Выберите строку.Buffer только когда один буфер действительно используется совместно несколькими потоками.

Разделите предложение по пробелам с помощью split(" "), затем пройдите по полученному массиву от последнего индекса к первому, добавляя каждое слово в StringBuilder. Символы внутри каждого слова сохранят свой исходный порядок.

На каждый символ используется один кадр стека, поэтому обычно до появления ошибки StackOverflowError проходит несколько тысяч символов. Точное ограничение зависит от размера стека потока JVM. Любая последующая версия полностью избегает этого предела.

Искусственный интеллект-помощник может прочитать стек tracНапример, укажите на отсутствующий или недостижимый базовый случай и объясните порядок развертывания кадров. Также составьте тесты для граничных случаев, таких как пустой ввод, ввод одного символа и нулевой ввод. Проверьте обоснование на реальном запуске.

Да. Copilot Обычно обратный метод строится на основе одной лишь сигнатуры, часто сначала предлагая вариант с StringBuilder. Проверьте базовый случай и сложность, поскольку кратчайшее предложение не всегда совпадает с версией, требуемой в упражнении.

Подведем итог этой публикации следующим образом: