陣列的迴圈左移
設將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;
}