【问题描述】将一个数组中的元素循环右移K位,要求只使用一个元素大小的附加存储空间,时间复杂度为O(n)。
【样例输入】
1 2 3 4 5 6 7 8 0
2
【样例输出】
7 8 1 2 3 4 5 6
【提示】0代表输入结束
#include <iostream>
using namespace std;
void reverse(int start, int end, int a[], int temp)
{
while (start < end)
{
temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
}
void move(int n, int len, int a[])
{
//先把前len-step位逆置
reverse(0, len - n - 1, a, a[len]);
//再把后step位逆置
reverse(len - n, len - 1, a, a[len]);
//最后总体逆置
reverse(0, len - 1, a, a[len]);
}
int main()
{
ios::sync_with_stdio(false);
int a[1000];
int i = 0;
while (1)
{
cin >> a[i];
if (a[i] == 0)
break;
i++;
}
int len = i;
int step;
cin >> step;
step = step % len;
move(step, len, a);
for (int i = 0; i < len; i++)
cout << a[i] << " ";
}