1. 程式人生 > >陣列的迴圈左移

陣列的迴圈左移

設將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;
}