按要求实现数组的循环右移K位
题目要求:时间复杂度为o(n), 而无需使用额外的空间。
算法思路
例子:abcd1234
1.先反转前k部分为:=> dcba1234
2.反转后面剩余元素: =>dbca4321
3.整体反转 :=> 1234abcd
void Reverse(int *array,int p,int q)
{
for(;p<q;p++,q--){
int temp=array[q];
array[q]=array[p];
array[p]=temp;
}
}
void RightRemove_K_Location(int *A,int n,int k){
k%=n;//防止K取值超过数组长度
Reverse(A,0,n-k-1);
Reverse(A,n-k,n-1);
Reverse(A,0,n-1);
}
测试代码
int main()
{
void Reverse(int *A,int p,int q);//逆转元素
void RightRemove_K_Location(int *A,int n,int k);
void Print(int *A,int n);
int A[]={1,2,3,4,5,6,7,8,9};
int n=sizeof(A)/sizeof(int);
RightRemove_K_Location(A,n,2);
Print(A,n);
return 0;
}
测试结果