您的位置:首页 > 编程语言

编程之美-2.17 数组移位循环

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

方法:

将数组A(含N个元素)右移K位,相当于把A分为两部分,前(N-K)个元素A1和后K个元素A2,右移的过程是将两部分交换位置,即原A=A1 A2,移位后为A'=A2 A1,A1,A2内部的元素顺序是不变的。因此具体实现可通过以下步骤完成:先将A的元素全部逆序排列(A2的元素放到A1的前面,但A1,A2内部元素是逆序的,因此需要后面再次逆转一次),再分别将前K个元素和后(N-K)个元素逆序排列。

注意:K<0,表示左转|K|位,(若|K|<N,相当于右移(N-K)位)

    K>N, 相对于移动(K%N)位。

实现代码如下:

#include <vector>
using namespace std;
template<class Type>
void Reverse(vector<Type>&v, int start, int end)
{
for (; start < end; start++, end--)
{
Type temp = v[start];
v[start] = v[end];
v[end] = temp;
}
return;
}

template<class Type>
void RightShiftKNum(vector<Type> &v, int K)
{
int len = v.size();
if (len == 0)
return;
if (K>len )
K %= len;
else if (K < -len)
K = len - (-1 * K) % len;
else if (K < 0)
K = len + K;
Reverse(v, 0, len - 1);
Reverse(v, 0, K-1);
Reverse(v, K,len-1);
return;
}
int main(void)
{

vector<char> v = { 'a', 'b', 'c', 'd', '1', '2', '3', '4'};
RightShiftKNum(v, -11);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程之美 C++代码