数组循环右移

Q:把一个含有 N 个元素的数组循环右移 K 位,要求时间复杂度为 O (N),且只允许使用两个附加变量。

 我一开始的思路是:

1.若k=整数倍N, 完成(右移K等于不动);

   k大于N,k=N%k;k小于N,开始步骤2。

2.tmp1保存取出的元素a[k];a[0]放在k;tmp2保存a[2k], tmp1放入2k;tmp1保存a[3k],tmp2放入3k...直到位置[0]被放入一个新值,一轮循环完毕。姑且这是一个从位置[0]出发,又回到位置[0]的接龙游戏。

  发现,若N%k==0,则需要从[0]开始,[0]结束...到[k-1]开始[k-1]结束,都执行一遍。若N%k!=0,则可能这样一条龙一次执行完了所有的元素,也可能只执行完了0~k-1中的部分(通过自己想的案例证实)

   所以这个方法还需要记录从[0]到[k-1]哪些已经被成功回置新元素,所有都回置过,就完成。

   这个方法当然不理想,甚至还不能证明正确性。

 

关于数组的一些算法,基本都涉及到翻转的问题。这个也不例外:

新的方法:整个过程把数组分为0~n-k-1和n-k~n-1两个部分,那么对左边翻转,右边翻转,再整体翻转,就有最后循环右移k的效果。

用i在左边范围,n-k+i在右边范围都试过,确实最后移到了i+k, i,满足条件

// 将buffer中start和end之间的元素逆序
void Reverse( int buffer[], int start, int end )
{
    while ( start < end )
    {
        int temp = buffer[ start ] ;
        buffer[ start++ ] = buffer[ end ] ;
        buffer[ end-- ] = temp ;
    }
}

// 将含有n个元素的数组buffer右移k位
void Shift( int buffer[], int n, int k )
{
    k %= n ;

    Reverse( buffer, 0, n - k - 1) ;
    Reverse( buffer, n - k, n - 1 ) ;
    Reverse( buffer, 0, n - 1 ) ;
}

 

转载于:https://www.cnblogs.com/jack-xu/p/4905241.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值