把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N)
分析与解法
假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位,比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换过程通过以下步骤完成:
1.逆序排列 abcd: abcd1234 -> dcba1234;
2.逆序排列 1234: dcba1234-> dcba4321;
3.全部逆序 dcba4321->1234abcd。
代码如下:
#include<iostream>
using namespace std;
void ReverseApart(int *data,int start,int end)
{
int i;
int temp;
int mid = (start + end) / 2;
for(i = start;i <= mid;i++)
{
temp = data[i];
data[i] = data[end + start - i];
data[end + start - i] = temp;
}
}
void Reverse(int *data,int length,int k)
{
k %= length;
if(k != 0)
{
ReverseApart(data,1,k);
ReverseApart(data,k+1,length);
ReverseApart(data,1,length);
}
}
void Output(int *data,int length)
{
for(int i = 1; i <= length; i++)
cout<<data[i]<<" ";
cout<<endl;
}
int main()
{
int data[]= {-1,1,2,3,4,5,6,7,8,9};
Reverse(data,9,3);
Output(data,9);
return 0;
}