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

本文探讨了数组元素的循环移位问题,介绍了直接打印、逐位移位和逆序三种方法,并对比了它们的时间复杂度。重点介绍了逆序法,这是一种能够在线性时间内完成移位的高效算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

要注意的是:当移位次数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)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值