解题思路:
第一种思路,将数组整体后移k位,然后让超出的部分回到首部。

大概是这样的

【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】【】【】

【】【】【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】//整体后移

【9】【10】【1】【2】【3】【4】【5】【6】【7】【8】【】【】//越界回归


image.png

这个做法的缺点是需要额外的数组空间,而且代码量多。


参考代码:

#include <stdio.h>
 
int main()
{
    int i,j=0;
    int x,n;
    int p[1007]={0};
     
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&p[i]);
    }
    scanf("%d",&x);
     
    for(i=x+n-1;i>=0;i--){//全部移动x位
        p[i]=p[i-x];
    }
     
    j=n;
    for(i=0;i<x;i++,j++){
        p[i]=p[j];
    }
     
    for(i=0;i<n;i++){
        printf("%d ",p[i]);
    }
     
    return 0;
}

第二种做法是使用取余判断。

以题目数据为例

10

1 2 3 4 5 6 7 8 9 10

2

最后的结果为

9 10 1 2 3 4 5 6 7 8 

也就是说在第9位置上的“9”来到了第1号位置,第10位置的“10”来到了第二号的位置,其他的数全部向后移动了两位。

向后移动两位就是下标+2来实现,而对于9号位10号位+2以后会变成11和12,超出数组范围,他们应该在1号和2号才对。

取余操作恰好可以实现这一点,11%10=1 12%10=2。对于超出了多少,就会回到多少,11号超出了1个位置,就会回到1位置。

这个代码的缺点是使用了额外的空间,优点是代码量少。

代码实现如下:

#include <bits/stdc++.h>

using namespace std;

int main(){
	int n,k;
	int p[1007],s[1007];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p[i];
	}
	cin>>k;//需要移动多少位 
	for(int i=0;i<n;i++){
		s[(i+k)%n]=p[i];//核心代码,取余归位 
	}
	for(int i=0;i<n;i++){
		cout<<s[i]<<" ";//打印输出 
	}
	 
	return 0;
}

第三种方法,通过调整输出顺序,来实现直接打印,核心也是第二种的取余的操作。

优点是代码量少,不需要额外的空间,缺点是只适用于竞赛和一些oj判题,数组内的存放还是之前输入的样子,不适用于面试等。

参考代码:

#include <bits/stdc++.h>

using namespace std;

int main(){
	int n,k;
	int p[1007],s[1007];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p[i];
	}
	cin>>k;//需要移动多少位 
	for(int i=0;i<n;i++){
		cout<<p[(i+n-k)%n]<<" "; //核心代码
	}
	 
	return 0;
}


点赞(0)
 

0.0分

23 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 23 条评论

29 4月前 回复TA
int arr[50];
void Move(int* arr, int n, int m)
{
	for (int j = 1; j <= m; ++j)
	{
		for (int i = n - 1; i >= 0; --i)
			arr[i + 1] = arr[i];
		arr[0] = arr[n ];

	}
	/*for(int i=0;i<n;++i)
	printf("%d ", arr[i]);*/
}
int main()
{
	
	int n,m;
	scanf("%d %d", &n,&m);
	for (int i = 0; i < n; ++i)
		scanf("%d", &arr[i]);
	Move(arr, n, m);
	for (int i = 0; i < n; ++i)
		printf("%d ", arr[i]);
	return 0;

}我这个调试了一下答案是正确的,为什么告诉我答案错误?
向志权 10月前 回复TA
#include<stdio.h>
#include<math.h>
int main()
{
	int i;
	int m,n;
	int x[100];
	int y[100];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&x[i]);
	}
	scanf("%d",&m);
	shift(x,y,n,m);
	printf("\n");
	return 0;
}
int shift(int x[],int y[],int n,int m);
int shift(int x[],int y[],int n,int m)
{
	
	int i;
	for(i=0;i<n;i++)
	{
		y[i+m]=x[i];
		if((i+m)>n-1)
		{
			y[abs(i+m-n)]=y[i+m];
		}
	}
	for(i=0;i<n;i++)
	{
		printf("%d ",y[i]);
	}
}
做了好久,呜呜呜
crj 10月前 回复TA
#include <stdio.h>
void sort(int* p,int* w, int n,int m)
{
	int c = 0;
	for (int i = n - m; i < n; i++)
	{
		*w++ = *(p + i);
	}
	for (int i = 0; i < n - m; i++)
	{
		*w++ = *(p + i);
	}
}
int main()
{ 
	int n;
	scanf("%d", &n);
	int arr[1000] = { 0 } ,ar[100] = { 0 } ;
	int c = 0,m;
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	scanf("%d", &m);
	sort(arr,ar, n,m);
	while (ar[c] != 0)
	{
		printf("%d ", ar[c++]);
	}
	return 0;
}
小兰 11月前 回复TA
#include<stdio.h>
int main()
{
    int n,m;
    scanf("%d",&n);
    int a[1007];
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for(int i=n-m;i<n;i++)
        printf("%d ",a[i]);
    for(int i=0;i<n-m;i++)
        printf("%d ",a[i]);
    return 0;
}
alex 1年前 回复TA
@夏予夏至 vocal 有点东西啊
火人内莉 1年前 回复TA
#include<stdio.h>
void houyi(int a[],int m,int n)
{
	int b=0;
	int temp[m];
	for(int i=0;i<m-n;i++)
	{
		temp[i+n]=a[i];
	}
	for(int j=m-n;j<m;j++)
	{
		temp[b]=a[j];
		b++;
	}
	for(int i=0;i<m;i++)
	{
		printf("%d ",temp[i]);
	}
}
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int a[m];
	for(int i=0;i<m;i++)
	{
		scanf("%d",&a[i]);
	}
	houyi(a,m,n);
	return 0;
}大神,这为什么不对?
李俊毅 1年前 回复TA
@dotcpp0586343 不对你发出来干嘛
dotcpp0586343 1年前 回复TA
#include<stdio.h>
int main(void)
{
	int n;
	int arr[1008]={0};
	int x; 
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", &arr[i]);
	scanf("%d", &x);
	for (int i = x; i < n ; i++)
		printf("%d ", arr[i]);
	for (int i = 0; i < x; i++)
		printf("%d ", arr[i]);
	return 0;
}
dotcpp0586343 1年前 回复TA
@dotcpp0586343 #include<stdio.h> int main(void) { 	int n; 	int arr[1008]={0}; 	int x;  	scanf_s("%d", &n); 	for (int i = 0; i < n; i++) 		scanf("%d", &arr[i]); 	scanf("%d", &x); 	for (int i = x; i < n ; i++) 		printf("%d ", arr[i]); 	for (int i = 0; i < x; i++) 		printf("%d ", arr[i]); 	return 0; }
dotcpp0586343 1年前 回复TA
#include<stdio.h>
int main(void)
{
	int n;
	int arr[1008]={0};
	int x; 
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++)
		scanf_s("%d", &arr[i]);
	scanf_s("%d ", &x);
	for (int i = x; i < n ; i++)
	{
		printf("%d ", arr[i]);
	}
	for (int i = 0; i < x; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}