整数数组有n个元素,将数组元素循环右移p位。假设元素原来为:1,2,3,4,5,6,p为3,则移动后的数组为:456123。
函数接口定义:
void move(int a[], int p);
裁判测试程序样例:
#include <stdio.h>
#define N 10
void move(int a[], int p);
int main()
{
int i,a[N]={1,2,3,4,5,6,7,8,9,10},k;
scanf("%d",&k);
move(a,k);
for(i=0;i<N;i++)
printf("%d ",a[i]);
return 0;
}
/* 请在这里填写答案 */
输入样例:
3
结尾无空行
输出样例:
8 9 10 1 2 3 4 5 6 7
思路:
第一种解法:将数组的元素每次向右移动一位,然后循环k次
实现代码如下:
void move(int a[], int p)
{
while (p--)//控制循环次数(此处也可以用for循环)
{
int k = a[N - 1];
for (int i = N - 1; i > 0; i--)//将元素向右移一位
{
a[i] = a[i - 1];
}
a[0] = k;
}
}
第二种解法:用空间来换时间,我们可以另外创建一个数组,然后将数存入这个数组中,比如我的数是a[N]={1,2,3,4,5,6,7,8,9},然后我们要移动三位,就可以把{_,_,_,_,_,_,7,8,9},将前面的书存入另外一个数组中{1,2,3,4,5,6,_,_,_},然后将后面的数往前移动{7,8,9,_,_,_,_,_,_},再把另外一个数组的数存入其中{7,8,9,1,2,3,4,5,6},实现元素移动,代码如下
void move(int a[], int p)
{
p = N - (p%N);
int* sp = (int*)malloc(p * sizeof(int));
int i, j=0;
for (i = 0; i < p; i++)
{
sp[i] = a[i];
}
for (i=p; i < N; i++)
{
a[j] = a[i];
j++;
}
//j=N-p;
for (i = 0; j < N; i++, j++)
{
a[j] = sp[i];
}
}