问题描述:
设有m个元素的数组,先输入正整数n,表示数组中每个元素循环右移n个单位,求输出后的数组
基本初步思路:一个一个移动,循环n次每次要使用temp储存a[m-1]
#include<stdio.h>
int main()
{
int m,n;
scanf("%d %d",&m,&n);
n%=m;
int a[m];
int i;
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
int temp;
int j;
for(j=0;j<n;j++)
{
temp=a[m-1];
for(i=m-1;i>0;i--)
{
a[i]=a[i-1];
}
a[i]=temp;
}
for(i=0;i<m;i++)
{
printf("%d ",a[i]);
}
return 0;
}
现在对其优化
基本思路:构建一个新数组,将原数组后n个元素取出,剩下的向后移动到底部,再将新数组的元素填充至原数组
#include<stdio.h>
int main()
{
int m,n;
scanf("%d %d",&m,&n);
n%=m;
int a[m];
int i;
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
int b[n],j;
for(j=0,i=m-n;i<m;i++)
{
b[j++]=a[i];
}
for(i=m-1;i>n-1;i--)
{
a[i]=a[i-n];
}
i=0;
for(j=0;j<=m-n;j++)
{
a[i++]=b[j];
}
for(i=0;i<m;i++)
{
printf("%d",a[i]);
}
return 0;
}
其实还能进一步优化
基本思路:将原数组逆序,再将原数组的前n个元素逆序,最后将数组的后m-n个元素逆序
#include<stdio.h>
void Reverse(int a[],int begin,int end);
int main()
{
int m,n;
scanf("%d %d",&m,&n);
n%=m;
int a[m];
int i;
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
Reverse(a,0,m-1);
Reverse(a,0,n-1);
Reverse(a,n,m-1);
for(i=0;i<m;i++)
{
printf("%d",a[i]);
}
return 0;
}
void Reverse(int a[],int begin,int end)
{
int i;
int temp;
for(i=begin;i<=(begin+end)/2;i++)
{
temp=a[i];
a[i]=a[end+begin-i];
a[end+begin-i]=temp;
}
return ;
}