n个整数存入一维数组中,将该组数循环移动m位。
这个题看起来简单,真正实现起来并不是那么容易。这里介绍三个思路:
1、逐渐后移:
每次向后移动一次,共移动m次,将最后一位放在第一位,缺点:算法复杂度较高。
#include <stdio.h>
int main()
{
int n,m, *a;
int i,j,temp;
scanf("%d",&n);
a=new int [n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(i=0;i<m;i++)
{
temp=a[0];
for(j=0;j<n-1;j++)
a[j]=a[j+1];
a[n-1]=temp;
}
for(i=0;i<n;i++)
printf("%5d",a[i]);
return 0;
}
2、借助空间换取时间:
定义另外一个数组,循环一次即可,用空间换取时间。
#include <stdio.h>
int main()
{
int n,m, *a,*b;
int i,j,temp;
scanf("%d",&n);
a=new int [n];
b=new int [n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(i=0;i<n;i++)
b[i]=a[(i+m)%n];
for(i=0;i<n;i++)
printf("%5d",b[i]);
return 0;
}
3、算法层面的思路:
假设给定的数字是1 2 3 4 5。假设向后移动2位,则将前2位逆置,将后3位逆置,最后整体逆置。过程如下:
2 1 3 4 5
2 1 5 4 3
3 4 5 1 2
参考代码如下:
#include <stdio.h>
int reverse(int a[], int begin, int end)
{
int low,high,temp;
low=begin; high=end;
while(low<high)
{
temp=a[low];
a[low]=a[high];
a[high]=temp;
low++; high--;
}
return 0;
}
int main()
{
int n,m, *a;
int i;
scanf("%d",&n);
a=new int [n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
reverse(a,0,m-1);
reverse(a,m,n-1);
reverse(a,0,n-1);
for(i=0;i<n;i++)
printf("%5d",a[i]);
return 0;
}