1008. 数组元素循环右移问题

来源:互联网 发布:数据库的三大范式题 编辑:程序博客网 时间:2024/04/30 01:00

这个题如果只是为了得到正确答案的话,使用直接打印的方法是最简单地。

但是如何能真正实现数组元素的循环移位呢?

要注意的是:当移位次数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.csdn.net/laizemu/article/details/4046791)

此方法能实现线性时间的移位,算法既简单又漂亮。在这里就不具体实现了。

不知道还有没有其他方式可以实现循环移位。

0 0