三次逆置即可
#include <stdio.h>
#define SIZE(a) (sizeof(a) / sizeof(a[0]))
#define SWAP(a, b) { \
int tmp = a; \
a = b; \
b = tmp; \
}
void print_array(int arr[], int len) {
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n\n");
}
void reverse(int arr[], int l, int r) {
while (l < r) {
SWAP(arr[l], arr[r]); //写成arr[l++]会运算两次
l++, r--;
}
}
void rotateLeft(int arr[], int n, int k) {
int x = k % n;
if (!x) return;
reverse(arr, 0, n - 1);
reverse(arr, 0, n - x - 1);
reverse(arr, n - x, n - 1);
}
int main(void) {
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
int k, len = SIZE(arr);
print_array(arr, len);
printf("k = ");
scanf("%d", &k);
printf("\n");
rotateLeft(arr, len, k);
print_array(arr, len);
return 0;
}