방법 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 Works 단계별 가이드
전체 메서드는 두 줄로 구성됩니다. 기본 케이스인 if (myStr.isEmpty())는 재귀 호출이 멈출 위치를 지정합니다. 재귀 호출 부분인 return reverseString(myStr.substring(1)) + myStr.charAt(0)는 작업을 두 부분으로 나눕니다. substring(1)은 첫 번째 문자 이후의 모든 문자열을 반환하고, charAt(0)은 첫 번째 문자에 추가된 문자열을 반환합니다. 시간 내에 역수 나머지.
Trac입력을 Guru99는 순서를 명확히 합니다. Java 연결이 발생하기 전에 각 호출마다 하나의 프레임을 푸시합니다.
| 상담 예약 번호 | 마이스트 | 다음 호출로 넘어갔습니다. | 표현이 끝나기를 기다리고 있습니다 |
|---|---|---|---|
| 1 | Guru99 | 우루99 | reverseString(“uru99”) + G |
| 2 | 우루99 | 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. 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 두 가지 방법 모두.
