题目
答案
#include<stdio.h>
#include<algorithm>
using namespace std;
void Swap(int a[],int left ,int right)
{
for(int i=left;i<=(left+right)/2;i++)
swap(a[i],a[left+right-i]);
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int a[n],i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
m=m%n;
if(m==0||n==m)
{
printf("%d",a[0]);
for(i=1;i<n;i++)
printf(" %d",a[i]);
return 0;
}
//第一次
Swap(a,0,n-1);
//第二次
Swap(a,0,m-1);
//第三次
Swap(a,m,n-1);
printf("%d",a[0]);
for(i=1;i<n;i++)
printf(" %d",a[i]);
}
注意
Swap函数中的判断条件i<=(left+right)/2
里的=
要记得写
算法分析
本题只需进行三次交换就可以实现数组的循环右移
我们拿下面的例子进行说明(n=8,m=5)
8 5
1 2 3 4 5 6 7 8
交换过程如下(黑色数字表示不动,红色数字表示交换的数字)
就这么简单!觉得还不错的同学可以点上一个宝贵的赞,谢谢大家!