방법 Reverse 문자열 Java 재귀 사용

⚡ 스마트 요약

Rev문자열을 뒤집다 Java 재귀 호출은 스택에서 첫 번째 문자를 제거하고, 남은 문자열을 뒤집은 다음, 그 첫 번째 문자를 끝에 추가하는 방식으로 작동합니다. 빈 문자열은 호출을 중지하고 스택을 해제합니다.

  • 🔘 기본 케이스: isEmpty() 메서드가 되돌릴 대상이 더 이상 없다고 보고하면 즉시 반환됩니다.
  • ☑️ 재귀 단계: substring(1)은 첫 번째 문자를 제거하고 charAt(0)은 역순으로 된 나머지 뒤에 다시 넣습니다.
  • 불변성: 모든 호출은 새로운 String 객체를 생성합니다. 왜냐하면 Java 문자열은 제자리에서 편집할 수 없습니다.
  • 🧪 Trace: Guru99는 문자 하나당 한 번씩, 그리고 빈 기본 케이스를 포함하여 총 7번 호출된 후 99uruG가 됩니다.
  • 🛠️ 더 빠른 옵션: StringBuilder.reverse()와 toCharArray()에 대한 두 포인터 교환은 모두 단일 패스에서 완료됩니다.
  • 📌 비용 : substring()을 사용한 재귀 호출은 2차 시간 복잡도로 실행되며 문자 하나당 하나의 스택 프레임을 사용합니다.

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 Works 단계별 가이드

전체 메서드는 두 줄로 구성됩니다. 기본 케이스인 if (myStr.isEmpty())는 재귀 호출이 멈출 위치를 지정합니다. 재귀 호출 부분인 return reverseString(myStr.substring(1)) + myStr.charAt(0)는 작업을 두 부분으로 나눕니다. substring(1)은 첫 번째 문자 이후의 모든 문자열을 반환하고, charAt(0)은 첫 번째 문자에 추가된 문자열을 반환합니다. 시간 내에 역수 나머지.

Trac입력을 Guru99는 순서를 명확히 합니다. Java 연결이 발생하기 전에 각 호출마다 하나의 프레임을 푸시합니다.

상담 예약 번호마이스트다음 호출로 넘어갔습니다.표현이 끝나기를 기다리고 있습니다
1Guru99우루99reverseString(“uru99”) + G
2우루99ru99reverseString(“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. charAt() 함수를 사용하는 for 루프 이 코드는 마지막 인덱스부터 0까지 역순으로 문자열을 순회합니다. 면접관들은 종종 이 버전을 요구하는데, 이는 로직을 위임하지 않고 직접 보여주기 때문입니다.

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 정렬 현악기 연습만큼 자주 연습하세요.

각 접근 방식의 시간 및 공간 복잡성

네 가지 버전의 비용은 동일하지 않습니다. 아래의 두 가지 2차 함수 항목은 모두 한 가지 공통된 원인을 가지고 있습니다. 바로 매 단계마다 완전히 새로운 문자열을 생성한다는 점이며, n개의 문자를 n번 복사하는 것은 n의 제곱에 해당하는 작업량입니다.

접근Time추가 공간
부분 문자열을 사용한 재귀 호출XNUMX(n²)XNUMX(n²)substring() 함수는 호출될 때마다 나머지 문자를 복사하며, 문자 하나당 하나의 스택 프레임이 저장됩니다.
charAt() 및 +를 사용한 for 루프XNUMX(n²)XNUMX(n²)각 연결 작업은 새로운 문자열을 할당하고 지금까지 수집된 모든 내용을 복사합니다.
StringBuilder.reverse()O (N)O (N)하나의 가변 버퍼, 하나의 패스, 그리고 서러그 쌍은 그대로 유지됩니다.
toCharArray()에 대한 두 개의 포인터O (N)O (N)배열 복사 1회, 그 후 추가 할당 없이 n/2번의 스왑이 발생합니다.

학습이나 호출 스택 동작 방식을 보여주기 위해서는 재귀 버전을 선택하고, 면접관이 직접 논리를 작성해 보라고 할 때는 문자 배열 버전을, 그리고 실제 제품에서는 StringBuilder.reverse()를 사용하세요. 교육용 솔루션과 실제 운영 환경용 솔루션 사이의 이러한 균형점은 고전적인 연습 문제 전반에 걸쳐 나타납니다. 버블 정렬 그리고 피보나치 시리즈소수 검사각각은 연습해 볼 가치가 있습니다. Java 두 가지 방법 모두.

자주 묻는 질문

문자열 객체는 불변(immutable)이므로 생성 후에는 내부의 문자가 절대 변경될 수 없습니다. 따라서 문자열을 뒤집을 때마다 새로운 객체가 생성됩니다. 매 단계마다 새로운 문자열 객체를 생성하지 않고 문자를 수정해야 하는 경우에는 StringBuilder 또는 char 배열을 사용하십시오.

isEmpty() 메서드의 첫 번째 호출은 null을 반환하지 않으므로 NullPointerException을 발생시킵니다. 재귀 호출이 시작되기 전에 진입점에 null을 반환하거나 IllegalArgumentException을 발생시키는 null 검사를 추가하여 진입점을 보호하십시오.

신뢰할 수 없습니다. charAt() 함수는 16비트 코드 단위로 작동하므로 서로게이트 쌍으로 저장된 문자가 분리되어 뒤집힌 텍스트에 대체 사각형이 표시됩니다. StringBuilder.reverse() 함수는 서로게이트 쌍을 함께 유지하므로 유니코드 텍스트에 더 안전한 선택입니다.

거의 모든 경우에 StringBuilder가 더 낫습니다. 둘 다 동일한 reverse() 메서드를 제공하지만 String은 그렇지 않습니다.Buffer 모든 호출을 동기화하므로 속도가 저하됩니다. 문자열을 선택하세요.Buffer 하나의 버퍼가 스레드 간에 실제로 공유될 때만 가능합니다.

문장을 공백을 기준으로 split(" ")으로 분할한 다음, 결과 배열을 마지막 인덱스부터 첫 번째 인덱스까지 순회하면서 각 단어를 StringBuilder에 추가합니다. 각 단어 안의 문자는 원래 순서를 유지합니다.

문자 하나당 하나의 스택 프레임이 사용되므로, 일반적으로 수천 개의 문자를 처리해야 StackOverflowError가 발생합니다. 정확한 한계는 JVM 스레드 스택 크기에 따라 달라집니다. 모든 반복적인 버전은 이러한 한계를 완전히 회피합니다.

AI 비서는 스택을 읽을 수 있습니다. trac예를 들어, 누락되었거나 도달할 수 없는 기본 사례를 지적하고 프레임이 해제되는 순서를 설명하십시오. 또한 빈 입력, 단일 문자 입력 및 null 입력에 대한 예외 처리 테스트를 작성하십시오. 실제 실행을 통해 추론을 검증하십시오.

예. 부조종사 일반적으로 함수 시그니처만으로 전체 역방향 메서드를 완성할 수 있으며, 종종 StringBuilder 형식을 먼저 제공합니다. 기본 사례와 시간 복잡도를 확인하세요. 가장 간결한 제안이 항상 문제에서 요구하는 버전이 아닐 수 있습니다.

이 게시물을 요약하면 다음과 같습니다.