数组循环右移——使用额外数组太麻烦,三次交换直接搞定!
发布日期:2021-05-06 03:52:55 浏览次数:27 分类:原创文章

本文共 667 字,大约阅读时间需要 2 分钟。

数组元素循环右移问题

题目

在这里插入图片描述

答案

#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 51 2 3 4 5 6 7 8

交换过程如下(黑色数字表示不动,红色数字表示交换的数字)
在这里插入图片描述

就这么简单!觉得还不错的同学可以点上一个宝贵的赞,谢谢大家!

上一篇:数组循环左移——使用额外数组太麻烦,三次交换直接搞定!
下一篇:分治法——最大子列和问题

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月12日 13时20分33秒