การกลับลำดับ String (Reverse String) เป็นคำถามสัมภาษณ์ Java ยอดนิยม บทความนี้รวบรวมวิธีการหลากหลาย ตั้งแต่ built-in method, recursion, loop, จนถึง Java 8 Stream
วิธีที่ 1: StringBuilder.reverse() - ง่ายที่สุด ✅ แนะนำ
public class ReverseString {
public static String reverse(String input) {
return new StringBuilder(input).reverse().toString();
}
public static void main(String[] args) {
System.out.println(reverse("Hello World")); // dlroW olleH
System.out.println(reverse("robot")); // tobor
}
}
ข้อดี: อ่านง่าย ประสิทธิภาพดี (O(n)) เป็น built-in
วิธีที่ 2: For Loop แบบคลาสสิก
public static String reverse(String input) {
StringBuilder sb = new StringBuilder();
for (int i = input.length() - 1; i >= 0; i--) {
sb.append(input.charAt(i));
}
return sb.toString();
}
วิธีที่ 3: toCharArray() + For-Each Loop
public static String reverse(String input) {
String reversed = "";
for (char c : input.toCharArray()) {
reversed = c + reversed; // prepend character
}
return reversed;
}
⚠️ คำเตือน: วิธีนี้สร้าง String object ใหม่ทุกครั้งใน loop (O(n²)) ไม่แนะนำสำหรับ String ยาว
วิธีที่ 4: Recursion (ฟังก์ชันเรียกตัวเอง)
public static String reverse(String input) {
if (input.isEmpty()) {
return input;
}
return reverse(input.substring(1)) + input.charAt(0);
}
// หรือ version tail-recursive (แต่ Java ไม่ optimize tail call)
public static String reverseRecursive(String input) {
return reverseHelper(input, "");
}
private static String reverseHelper(String remaining, String reversed) {
if (remaining.isEmpty()) {
return reversed;
}
return reverseHelper(remaining.substring(1), remaining.charAt(0) + reversed);
}
วิธีที่ 5: Java 8 Stream API
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public static String reverse(String input) {
return IntStream.range(0, input.length())
.mapToObj(i -> input.charAt(input.length() - 1 - i))
.map(String::valueOf)
.collect(Collectors.joining());
}
Benchmark: เปรียบเทียบประสิทธิภาพ
| วิธี | Time Complexity | Space Complexity | คำแนะนำ |
|---|---|---|---|
| StringBuilder.reverse() | O(n) | O(n) | ✅ ใช้งานจริง |
| For Loop + StringBuilder | O(n) | O(n) | เข้าใจหลักการ |
| toCharArray + String concat | O(n²) | O(n²) | ❌ หลีกเลี่ยง |
| Recursion | O(n) | O(n) stack | สอบสัมภาษณ์ |
| Java 8 Stream | O(n) | O(n) | Functional style |
Unit Test ตัวอย่าง (JUnit 5)
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ReverseStringTest {
@Test
void testReverse() {
assertEquals("tobor", ReverseString.reverse("robot"));
assertEquals("dlroW olleH", ReverseString.reverse("Hello World"));
assertEquals("", ReverseString.reverse(""));
assertEquals("a", ReverseString.reverse("a"));
assertEquals("12345", ReverseString.reverse("54321"));
}
}