《编程之美》读书笔记(九):数组循环位移

2.17“数组循环位移”

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

 

网友azuryy提出了自己的解题思路,http://hi.baidu.com/azuryy/blog/item/18957077f796b31db051b9c0.html

 

博客原文:

这个问题,我在面试中也问过,几乎所有的candidates都能给出解法一,至于解法二,并没有新意,读过STL源代码的人都知道:

STL里面的rotate函数<algorithm>,就是用这种方法实现的

template<class _BidIt> inline
    void _Rotate(_BidIt _First, _BidIt _Mid, _BidIt _Last,   bidirectional_iterator_tag)
    {   
        std::reverse(_First, _Mid);
        std::reverse(_Mid, _Last);
        std::reverse(_First, _Last);
    }

 

但是,STL只是在一个数组里面移位,所移动的长度不会超过数组的大小。如果一个长度是3的数组循环右移1000000位,也就是 K >> N的时候

RightShift(int* arr, int N, int k)

{

K %= N ; //很简单但是不同反响的一句

..........

}

转载于:https://www.cnblogs.com/bvbook/archive/2008/07/30/1256271.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值