โจทย์
ได้รับอาร์เรย์หรือสตริง ต้องการกลับลำดับองค์ประกอบ (reverse)
ตัวอย่าง
Input (array): {2, 5, 7, 1, 9}
Output: {9, 1, 7, 5, 2}
Input (string): "Hello!"
Output: "!olleH"
อัลกอริทึม
ใช้ Two Pointers Technique:
- กำหนด pointer `start` ที่ต้น (index 0) และ `end` ที่ท้าย (index n-1)
- Swap องค์ประกอบที่ `start` และ `end`
- Increment `start`, Decrement `end`
- ทำซ้ำจนกว่า `start >= end`
วิธีที่ 1: Iterative Approach (แนะนำ)
#include <iostream>
#include <algorithm> // สำหรับ std::swap
using namespace std;
void reverseArrayIterative(int arr[], int start, int end) {
while (start < end) {
swap(arr[start], arr[end]); // ใช้ std::swap
start++;
end--;
}
}
void reverseStringIterative(string& str) {
int start = 0, end = str.length() - 1;
while (start < end) {
swap(str[start], str[end]);
start++;
end--;
}
}
int main() {
// Array
int arr[] = {6, 9, 1, 4, 0, 5};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Original Array: ";
for (int i = 0; i < n; i++) cout << arr[i] << " ";
cout << endl;
reverseArrayIterative(arr, 0, n - 1);
cout << "Reversed Array: ";
for (int i = 0; i < n; i++) cout << arr[i] << " ";
cout << endl;
// String
string str = "Hello!";
cout << "\nOriginal String: " << str;
reverseStringIterative(str);
cout << "\nReversed String: " << str;
return 0;
}
ผลลัพธ์
Original Array: 6 9 1 4 0 5 Reversed Array: 5 0 4 1 9 6 Original String: Hello! Reversed String: !olleH
วิธีที่ 2: Recursive Approach
void reverseArrayRecursive(int arr[], int start, int end) {
if (start >= end) return;
swap(arr[start], arr[end]);
reverseArrayRecursive(arr, start + 1, end - 1);
}
void reverseStringRecursive(string& str, int start, int end) {
if (start >= end) return;
swap(str[start], str[end]);
reverseStringRecursive(str, start + 1, end - 1);
}
วิธีที่ 3: ใช้ STL (Best Practice)
#include <algorithm> #include <vector> #include <string> // Array / Vector reverse(arr, arr + n); // C-style array reverse(vec.begin(), vec.end()); // std::vector // String reverse(str.begin(), str.end()); // std::string
Complexity
- Time: O(N) - swap N/2 ครั้ง
- Space (Iterative): O(1) - in-place
- Space (Recursive): O(N) - recursion stack
สรุป
การ reverse อาร์เรย์/สตริงควรใช้ std::reverse จาก <algorithm> ซึ่ง optimized, tested, และ readable ที่สุด หากต้อง implement เอง ให้ใช้ iterative two-pointers approach เพื่อประสิทธิภาพและความปลอดภัย