1. 스트링빌더/스트링버퍼
가장 일반적이고 간단한 방법은 StringBuilder/StringBuffer를 사용하는 것입니다 .public static String reverseString(String str) {
return new StringBuilder(str).reverse().toString();
}
최고의 솔루션 = 가장 간단합니다. Java에서 문자열을 뒤집는 방법을 묻는다면 이것이 가장 먼저 염두에 두어야 할 사항입니다. 하지만 앞서 알고리즘에 대해 이야기했지요? 기본적으로 제공되지 않는 솔루션을 살펴보겠습니다.
2. 어레이 솔루션
public static String reverseString(String str) {
char[] array = str.toCharArray();
String result = "";
for (int i = array.length - 1; i >= 0; i--) {
result = result + array[i];
}
return result;
}
toCharArray 메소드를 사용하여 문자열을 배열로 변환합니다 . 이 배열의 끝부터 for 루프를 실행하여 결과 문자열에 문자를 추가해 보겠습니다.
3. charAt를 사용한 솔루션
public static String reverseString(String str) {
String result = "";
for (int i = 0; i < str.length(); i++) {
result = str.charAt(i) + result;
}
return result;
}
이 경우에는 String 클래스 메서드 인 charAt를 사용하여 각 문자를 추출하기 때문에 문자열을 배열로 분할할 필요조차 없습니다 (for 루프는 역방향이므로 문자를 순차적으로 뒤로 가져올 수 있습니다).
4. 스택을 이용한 솔루션
Stack 클래스는 오랫동안 사용되지 않았으며 더 이상 사용되지 않는 것으로 간주되지만 참고로 이를 사용하는 솔루션을 살펴보는 것이 유용할 것입니다.public static String reverseString(String str) {
Stack<Character> stack = new Stack<>();
String result = "";
for (Character character : str.toCharArray()) {
stack.add(character);
}
while (!stack.isEmpty()) {
result = result + stack.pop();
}
return result;
}
여기서 다시 toCharArray를 사용하여 문자열을 배열로 분할하고 일반 유형인 Character를 사용하여 스택 에 모두 넣습니다 . 다음으로 스택 상단에서 요소를 가져오기 시작합니다. LIFO 구조 인 L ast I n First O ut( 선입 , 후출) 스택의 특성으로 인해 요소는 뒤로 가져오고 결과는 결과 행에 저장됩니다.
5. 재귀에 의한 해법
거의 모든 알고리즘 문제는 재귀를 사용하여 해결할 수 있습니다. 그리고 여기서도 그녀 없이는 할 수 없습니다. 아니면 그들 없이도. 결국 오늘 우리는 재귀를 해결하는 한 가지 방법이 아니라 여러 가지 방법을 고려할 것입니다.-
방법 1
public static String reverseString(String str) { String rightStr; String leftStr; int length = str.length(); if (length <= 1) { return str; } leftStr = str.substring(0, length / 2); rightStr = str.substring(length / 2, length); return reverseString(rightStr) + reverseString(leftStr); }
rightStr 및 leftStr 변수를 사용하여 들어오는 문자열을 두 개의 동일한 부분으로 분할합니다. 다음으로, 이 분할을 사용하여 문자열을 나눌 수 있는 가장 작은 부분(1자)으로 나눕니다. 그 후, 재귀가 무너지기 시작하고 문자를 반대 순서로 반환합니다(오른쪽에 있던 문자는 왼쪽에 배치되고 왼쪽에 있는 문자는 오른쪽에 배치되었습니다).
각 재귀는 메소드에 대한 다중 호출이며 결과적으로 상당한 리소스 지출이라는 점을 잊어서는 안됩니다. 음, 도달할 수 없는 종료 조건이 있는 재귀에 대해 이야기하고 있다면 이것이 무한대 및 StackOverflowError로 가는 경로입니다.
-
방법 2
여기서는 index 메소드에 추가 인수가 필요합니다.
이 메소드가 실행되면 문자열 길이는 -1로 지정됩니다.
String str = "JavaRush forever"; System.out.println(reverseString(str, str.length()-1));
그리고 방법 자체는 다음과 같습니다.
public static String reverseString(String str, int index) { if(index == 0){ return str.charAt(0) + ""; } char letter = str.charAt(index); return letter + reverseString(str, index-1); }
색인은 지금 사용할 행 요소를 나타내는 지표 역할을 합니다(그리고 마지막 요소를 사용할 것입니다).
따라서 인덱스가 첫 번째 요소에 도달하면 종료 조건을 설정합니다.
- 방법 3
public static String reverseString(String str) { if (str.length() <= 1) { return str; } return reverseString(str.substring(1)) + str.charAt(0); }
이 방법은 본질적으로 재귀적인 방법 중 가장 간단합니다. 그리고 우리가 기억하는 것처럼 단순 = 최고입니다.
각 실행 중에 동일한 문자열을 지정하지만 첫 번째 요소는 없습니다. 종료 조건에 도달하면(한 문자가 남을 때) 재귀가 축소되기 시작하고 이전에 사용되지 않은 문자가 각 후속 결과에 추가됩니다.
이전 메소드 실행 결과에 문자 인덱스를 사용하여 얻은 값을 더하고 그 결과를 반환합니다.
6. XOR 사용
XOR 은 논리적 비트 단위 연산입니다. 두 변수의 경우 인수 중 하나가 true이고 다른 하나가 false인 경우에만 연산 결과가 true입니다.ㅏ | 비 | 와이 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
(A XOR B) XOR B = A
(A XOR B) XOR A = B
방법은 다음과 같습니다.
public static String reverseString(String str) {
char[] arr = str.toCharArray();
int low = 0;
int high = arr.length - 1;
String result = "";
while (low < high) {
arr[low] = (char) (arr[low] ^ arr[high]);
arr[high] = (char) (arr[low] ^ arr[high]);
arr[low] = (char) (arr[low] ^ arr[high]);
low++;
high--;
}
for (int i = 0; i < arr.length; i++) {
result = result + arr[i];
}
return result;
}
여기서 무슨 일이 일어나고 있는지 알아 봅시다. 들어오는 문자열에서 배열을 만듭니다. 배열을 순회하기 위한 인덱스를 저장하는 두 개의 변수 low 및 high 를 만듭니다 . 따라서 처음부터 끝까지 이동합니다. 값은 0이고 두 번째는 끝에서 처음으로 arr.length - 1 로 설정합니다 . 인덱스 high 가 low 보다 큰 한 재생되는 루프에 들어갑니다 . 여기에서 배타적 OR 사용이라는 재미있는 일이 일어나기 시작합니다. 예를 들어 x 와 y를 살펴보겠습니다 . arr[high] = 'x' ; 이진 코드는 1 1 1 1 0 0 0입니다. 이때 arr[high] = 'n'; 이진 코드 - 1 1 0 1 1 1 0 루프의 XOR 연산에서 얻을 수 있는 내용은 다음과 같습니다.
-
arr[low] = (char) (arr[low] ^ arr[high]);
arr[low] = 1 1 0 1 1 1 0 arr[high] =1 1 1 1 0 0 0 arr[low] = 0 0 1 0 1 1 0
-
arr[높음] = (문자) (arr[낮음] ^ arr[높음]);
arr[low] = 0 0 1 0 1 1 0 arr[high] = 1 1 1 1 0 0 0 arr[high] = 1 1 0 1 1 1 0
-
arr[low] = (char) (arr[low] ^ arr[high]);
arr[low] = 0 0 1 0 1 1 0 arr[high] = 1 1 0 1 1 1 0 arr[low] = 1 1 1 1 0 0 0
GO TO FULL VERSION