问题:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。
#include <stdio.h>
Reverse(char* arr,int b,int e){
for(;b<e;b++,e--){
int temp=arr[e];
arr[e]=arr[b];
arr[b]=temp;
printf("%d: %s\n",b,arr);
}
}
RightShift(char* arr,int N,int K){
K%=N; //因为有可能会出现K>N,这种情况下右移K-N次与右移K次的效果是相同的
Reverse(arr,0,N-K-1); //如果是左移,就写成Reverse(arr,0,K-1);
Reverse(arr,N-K,N-1); //Reverse(arr,K,N-1);
Reverse(arr,0,N-1);
}
int main(){
int N=0,K=0;
char s[100];
// memset(s,'0',sizeof(char)*100);
scanf("%s%d",s,&K);
N = strlen(s);
RightShift(s,N,K);
printf("%s\n",s);
return 0;
}
实现代码如下:
/*
*Author:cbjust
*Date:2013-01-10
*
*/
#include <stdio.h>
#include <string.h>
//左移
void leftShift(char a[],int N,int K){
int i;
char p[1001];
memset(p,'0',sizeof(p));
//将数组a中要移位的字符串存放在数组p中
for(i=0;i<K;i++){
p[i] = a[i];
}
//将数组a中元素前移K个位置
for(i=0;i<N-K;i++){
a[i] = a[i+K];
}
//将数组p中元素赋值给数组a
for(i=N-K;i<N;i++){
a[i]=p[i-N+K];
}
}
//右移
void rightShift(char a[],int N,int K){
int i;
char p[1001];
memset(p,'0',sizeof(p));
//将数组a中要移位的字符串存放在数组p中
for(i=0;i<K;i++){
p[i] = a[i+N-K];
}
//将数组a中元素后移K个位置
for(i=0;i<N-K;i++){
a[N-1-i] = a[N-1-i-K];
}
//将数组p中元素赋值给数组a
for(i=0;i<K;i++){
a[i]=p[i];
}
}
int main(){
char a[1001];
int K,N;
scanf("%s%d",a,&K);
N = strlen(a);
// leftShift(a,N,K);
// printf("%s\n",a);
rightShift(a,N,K);
printf("%s\n",a);
return 0;
}方法2相比方法1,只是增加了数组p的开销~时间复杂度依然为O(n)
6050



被折叠的 条评论
为什么被折叠?



