数组的循环左移
Posted wudikzl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组的循环左移相关的知识,希望对你有一定的参考价值。
设将n(n>1)个整数存放到一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(x0, x1…, xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。
多组数据,每组数据有三行。第一行为一个整数n,代表数组R中有n个元素。第二行为数组R中的n个元素(元素之间用空格分隔)。第三行为一个整数p,代表将R中的序列循环左移p个位置。当n等于0时,输入结束。
每组数据输出一行,为移动后的数组R中所存放的序列。每两个数之间用空格分隔。
5 1 2 3 4 5 1 6 -1 2 3 2 4 3 3 0
2 3 4 5 1 2 4 3 -1 2 3
思路:新开了一个数组来实现左移,计算公式类似于循环队列,采取取模的方法。本来也想过写swap函数,但感觉很麻烦。
#include<iostream>
using namespace std;
#define MAX 500
struct List
{
int *elem;
int length;
} ;
void in(List &L,int n)
{
L.elem=new int[MAX];
L.length=0;
for(int i=0;i<n;i++)
{
L.length++;
cin>>L.elem[i];
}
}
void rev(List &L)
{
int yi,temp[L.length];
cin>>yi;//输入移动量
for(int i=0;i<L.length;i++)
temp[(i-yi+L.length)%L.length]=L.elem[i];//取模运算实现位移
for(int i=0;i<L.length-1;i++)
cout<<temp[i]<<" ";
cout<<temp[L.length-1]<<endl;//系统要求最后输出的字符后面没空格,就这样实现了
}
int main()
{
List L;
int n;
while(1)
{
cin>>n;
if(n==0)
break;//n=0退出
in(L,n);
rev(L);
}
return 0;
}
以上是关于数组的循环左移的主要内容,如果未能解决你的问题,请参考以下文章