这个题如果只是为了得到正确答案的话,使用直接打印的方法是最简单地。
但是如何能真正实现数组元素的循环移位呢?
要注意的是:当移位次数k大于数组长度N的时候,跟移位k = k%n的效果是一样的。
我能想到的方法是,每次向右移一位,移动n次,实现方法如下:
#include <stdio.h>
void shiftRight(int *array, int offset, int N);
void shiftOne(int *array, int N);
int main()
{
int N, offset, i;
scanf("%d %d", &N, &offset);
int array[N];
/* input */
for (i = 0; i < N; i++)
scanf("%d", array+i);
/* shift right */
offset %= N;
shiftRight(array, offset, N);
/* output */
for (i = 0; i < N; i++)
printf("%d%c", array[i], i < N-1 ? ' ' : '\n');
return 0;
}
void shiftRight(int *array, int offset, int N)
{
while ( offset-- > 0)
shiftOne(array, N);
}
void shiftOne(int *array, int N)
{
/* shift the array to right for one,
and the last element become the first */
int last = array[N-1];
for( int i = N-1; i > 0; i-- )
array[i] = array[i-1];
array[0] = last;
}
显然这应该不是最好的方法,网上一查,发现了一个叫逆序的方法:(参见:http://blog.youkuaiyun.com/laizemu/article/details/4046791)
此方法能实现线性时间的移位,算法既简单又漂亮。在这里就不具体实现了。
不知道还有没有其他方式可以实现循环移位。