數組的循環左移


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM