设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度 O(N)且只允许使用两个附加变量。
如K=4,abcd1234 ----------------->>>>>> 1234abcd。
如果abcd1234循环右移12位的话,和循环右移4位得到的结果一样。
设字符串一共有N位。则 有 k' = k % N ;
设abcd234 右移4位,
1、逆排序:abcd1234-----------> dcba1234
2、逆排序:dcba1234 -----------> dcba4321
3、逆排序:dcba4321-----------> 1234abcd
时间复杂度:O(N)
#include<iostream>
using namespace std;
void Reverse(char *str,int b,int e)
{
for (;b<e;b++,e--)
{
int temp=str[b];
str[b]=str[e];
str[e]=temp;
}
}
void RightShift(char *str,int N ,int k)
{
k=k%N;
Reverse(str,0,N-k-1);
Reverse(str,N-k,N-1);
Reverse(str,0,N-1);
}
int main()
{
char *str;
int i=1;
int k;
char ch;
str=(char*)malloc(sizeof(char)*(i+1));
cout<<"请输入字符串:"<<endl;
while ((ch=getchar())!='\n')
{
str[i-1]=ch;
i++;
str=(char*)realloc(str,sizeof(char)*(i+1));
}
str[i-1]='\0';
cout<<"请输入右移的 K 的值:";
cin>>k;
RightShift(str,i-1,k);
cout<<"循环右移"<<k<<"位之后:"<<endl;
cout<<str<<endl;
free(str);
return 0;
}