问题
思路
这个问题和将数组的前N-M个元素和后M个元素整体位置互换(两组元素内的相对位置不变)本质上是一个问题,采用经典算法
(1)先将整个数组的元素位置翻转
(2)再将前M个元素位置翻转
(3)最后将后N-M个元素位置翻转
另外需要注意,要用M=M%N处理M,否则当M>N时会报错
#include<stdio.h>
#include<stdlib.h>
void reverse(int p[], int low, int high, int size)
{
int mid = (low + high) / 2;
int temp, i, j;
if (low<0 || high>size - 1 || low >= high)
return;
for (i = low, j = high; i <= mid; i++, j--)
{
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
int main(void)
{
int n, m;
scanf("%d %d", &n, &m);
m = m % n;
int* p = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++)
scanf("%d", &p[i]);
reverse(p, 0, n - 1, n);
reverse(p, 0, m - 1, n);
reverse(p, m, n - 1, n);
for (int i = 0; i < n; i++)
printf("%d%c", p[i], i == n - 1 ? '\0' : ' ');
return 0;
}