机试——数组元素循环左移

数组元素循环左移

理论

循环左移pos位,即将数组中的每个元素下标向前移动pos位,其中前面没有位置的数组元素循环移位到数组的末尾
如下图,长度为4的数组循环左移一位,即a1-a3分别移位到数组的第1-3位,而a0则移位到第4位
在这里插入图片描述
而我们今天要谈的是【将一维数组中的元素循环左移P个元素】
题目大致如下:设将n(n>1)个整数存放到一维数组R中,设计一个算法,将R中的序列循环左移P(0<P<n)个位置,即将R中的数据由{X0,X1,…,Xn-1}变换为{Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1}
这里就要用到一个算法结论,即
从{X0,X1,…,Xn-1}变换为{Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1}需要3步:
(1){X0,X1,…,Xp-1}数组前部分逆转位置
(2){Xp,Xp+1,…,Xlen-1}数组后一部分逆转位置
(3){X0,X1,…,Xlen-1}整个数组逆转位置
从而我们可以将这种思想归纳为函数cycleLeft(int arr[],int len,int pos)

鉴于逆转的操作比较独立且语句不少,因而我们单独为其构造一个reverse(int arr[],int begin,int end)逆转函数
逆转数组元素如下图所示,需要引入一个过渡变量temp暂存要转换的其中一个元素
在这里插入图片描述

代码

//数组元素循环左移 
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;

//逆置代码
void reverse(int arr[],int begin,int end){
	int i,j;
	for(i = begin,j = end;i < j;i++,j--){
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}
//循环左移代码,arr为操作数组,len为数组长度,pos为为移动位数 
void cycleLeft(int arr[],int len,int pos){
	reverse(arr,0,pos-1);
	reverse(arr,pos,len-1);
	reverse(arr,0,len-1);
}
int main(){
	int len,arr[1010];
	cout<<"请输入数组长度与数据:"<<endl;
	cin>>len;
	for(int i=0;i<len;i++){
		cin>>arr[i];
	}
	cout<<"循环左移之前的数组为:";
	for(int i=0;i<len-1;i++){
		cout<<arr[i]<<" ";
	}
	cout<<arr[len-1]<<endl;
	
	cout<<"请输入循环左移的位数:";
	int CLnum;
	cin>>CLnum;
	cycleLeft(arr,len,CLnum);
	
	cout<<"循环左移之后的数组为:";
	for(int i=0;i<len-1;i++){
		cout<<arr[i]<<" ";
	}
	cout<<arr[len-1]<<endl;
	return 0;
}

代码输出

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李霁明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值