void move(int arr[], int m) {
int i;
if (i >= 0 && i <= N-1-m) { // ❌ i 未初始化
for (i = 0; i <= m-1; i++)
*arr(i+m-1) = *arr(i); // ❌ arr() 非法語法,應為 arr[]
}
// ...
}
error C2064: term does not evaluate to a function:arr(i) 被解析為函數調用,但 arr 是數組/指針,不可調用arr[index] 或 *(arr + index)
#include
#include
#include
#define N 10
// 三次反轉法:時間 O(N),空間 O(1)
void rotate_right(int arr[], int n, int m) {
m %= n; // 處理 m > n 情況
if (m == 0) return;
// 1. 反轉整個數組
for (int i = 0, j = n-1; i < j; i++, j--) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
// 2. 反轉前 m 個
for (int i = 0, j = m-1; i < j; i++, j--) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
// 3. 反轉後 n-m 個
for (int i = m, j = n-1; i < j; i++, j--) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
}
// 輔助:打印數組
void print_arr(int arr[], int n) {
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\n");
}
int main() {
int arr[N], m;
printf("Enter %d numbers: ", N);
for (int i = 0; i < N; i++) scanf("%d", &arr[i]);
printf("Enter m: "); scanf("%d", &m);
printf("Original: "); print_arr(arr, N);
rotate_right(arr, N, m);
printf("Rotated: "); print_arr(arr, N);
return 0;
}
| 方法 | 時間複雜度 | 空間複雜度 | 特點 |
|---|---|---|---|
| 臨時數組法 | O(N) | O(N) | 直觀易懂,需額外內存 |
| 單步移位法 | O(N×m) | O(1) | m 較大時效率低 |
| 三次反轉法 | O(N) | O(1) | ✅ 推薦:原地、高效、標準庫實現 |
| 環狀替換法 | O(N) | O(1) | 需 gcd 判斷循環數,較複雜 |
// 等價聲明
void rotate_right(int arr[], int n, int m);
void rotate_right(int *arr, int n, int m); // 推薦:語義更清晰
// 內部訪問
arr[i] // 數組下標法(推薦,可讀性強)
*(arr + i) // 指針算術法(等價)
理解數組退化為指針、下標與指針算術等價性,是寫出正確高效 C 代碼的基石。