1. 程式人生 > 實用技巧 >1008 陣列元素迴圈右移問題

1008 陣列元素迴圈右移問題

1008 陣列元素迴圈右移問題

這個問題實際上還是比較容易解出來的,比如可以用連結串列,也可以用陣列交換,也可按照特定順序直接輸出;

  • 直接輸出方式:我們可以想象一下,資料迴圈移動,不過是從陣列的中間部分開始輸出,然後回到開頭,繼續輸出,直到陣列元素全部輸出。比如陣列a[10],1 2 3 4 5 6 7 8 9 10 ,當我們移動3個數據位的時候,輸出序列就是 :8 9 10 1 2 3 4 5 6 7 ,那麼是不是可以取巧,直接從8開始輸出,然後回到1,再輸出到7呢?——可以

  • 陣列交換:我擔心直接輸出資料不行,那我交換資料,就用那種老老實實的方法,總沒問題吧。可以,但是相對複雜一點,首先每一次挪動一個數據,把最後面的資料放入第一個資料位,剩下的往後挪一位,這樣迴圈m次,可以達到我們的目的。然後直接輸出即可。

  • 連結串列方式:我覺得這個方式是比較好的,首先建立連結串列,當然,採取尾插法比較好,這樣產生的連結串列序列是正序,方便處理。不過還需要注意一點,那就是關於最後一個節點的next應該接上第一個結點。這實際上是一個帶頭結點的單迴圈連結串列。當我們的連結串列建立完成之後,其實得到了一個圍成了一個圓的資料組,我們按照個數m開始數,數到第m+1個數據時,開始輸出,直到我們回到這個節點,資料輸出完畢,我覺得這樣做簡便很多。

下面給出對應的相關程式碼:

//直接輸出方式
int
main() { int N,M; cin>>N>>M; int * array = new
int [N]; for(int i = 0;i < N;i++) cin>>array[i]; M = M % N; for(int j = N - M, i = 0;i < N;j++, i++) { if(j == N) j = 0; cout<<array[j]; if(i != N-1) cout<<" "; } return 0; }

//連結串列方式
struct List {
    
int data; struct List * next; }; int main() { int N,M; cin>>N>>M; List * head = (List *)malloc(sizeof(List)); List * p,* temp = head;
  //尾插法建立連結串列
for(int i = 0;i < N;i++) { p = (List *)malloc(sizeof(List)); cin >> p->data; temp->next = p; temp = p; }
  //尾結點連線上首節點 temp
->next = head->next; temp = head; M = M % N;
  //尋找出輸出開頭的節點
for(int i = 0;i < N-M;i++) temp = temp->next; head = temp;
  //輸出連結串列 List
* out = head->next; for(int i = 0;i < N;i++) { cout << out->data; if(i != N-1) cout << " "; out = out->next; } return 0; }
//陣列交換
for(i = 0;i < m;i++) { t = a[n-1]; for(j = n-m;j >= 0;j--) { a[j+1] = a[j]; } a[0] = t; }//資料整體往後挪一位,然後最後一位放在最前面,迴圈m次即可

2020-07-14