【题目】有一个整数数组,现要求实现这个整数数组的循环右移。如:1,2,3,4,5 则循环右移两位后结果是:4,5,1,2,3。
//这个做法主要是执行3次倒序,相比于执行N次M个数右移一位效率高一点点,但是也不是最好的做法。相对好理解一点。
#include <stdio.h>
#include <stdlib.h>
#define swap(a,b) a^=b,b^=a,a^=b
void RightShift(int *Array,int N,int M)
{
int i,j;
if(M > 0 && M <N){
for (i = 0,j = N-1;i < j; i++,j--)//全部倒序
swap(Array[i],Array[j]);
for (i = 0,j = M-1;i < j; i++,j--)//前M个数倒序
swap(Array[i],Array[j]);
for (i = M,j = N-1;i < j; i++,j--)//后N-M个数倒序
swap(Array[i],Array[j]);
}
}
int main()
{
int number[100],M,N;
int i;
scanf("%d%d",&N,&M);
for (i = 0;i < N ;i++)
scanf("%d",&number[i]);
M %= N; //M>N时转换为等价的小于N的数
RightShift(number,N,M);
for(i = 0 ;i < N - 1;i++)
printf("%d ",number[i]);
printf("%d\n",number[N-1]);
return 0;
}
本文介绍了一种通过三次倒序实现数组循环右移的方法。该方法适用于任何整数数组,并通过示例代码展示了如何实现这一操作。对于数组大小N大于移位次数M的情况,这种方法能有效地减少不必要的元素移动。
789

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



