PAT 乙級 1008 數組元素迴圈右移問題 (20) C++版

來源:互聯網
上載者:User

標籤:格式   防止   nbsp   定義   輸入   strong   用例   長度限制   ace   

1008. 數組元素迴圈右移問題 (20)時間限制400 ms記憶體限制65536 kB代碼長度限制8000 B判題程式Standard

一個數組A中存有N(N>0)個整數,在不允許使用另外數組的前提下,將每個整數迴圈向右移M(M>=0)個位置,即將A中的資料由(A0A1……AN-1)變換為(AN-M …… AN-1 A0 A1……AN-M-1)(最後M個數迴圈移至最前面的M個位置)。如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?

輸入格式:每個輸入包含一個測試案例,第1行輸入N ( 1<=N<=100)、M(M>=0);第2行輸入N個整數,之間用空格分隔。

輸出格式:在一行中輸出迴圈右移M位以後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。

輸入範例:
6 21 2 3 4 5 6
輸出範例:
5 6 1 2 3 4


思路:該題最簡單的做法就是使用鏈表,大家可以試試,O(1)時間完成,本文採用一種三次逆置演算法來實現,大家注意逆置區間,思路還還是比較清晰,現將左區間逆置,再將右區間逆置,再將整體區間逆置,即可得到結果

注意點:
1.要考慮M大於N的情況
2.逆置區間的選定

 1 // 1008_1.cpp : 定義控制台應用程式的進入點。 2 // 3  4 #include "stdafx.h" 5 #include<iostream> 6 #include<list> 7 #include<algorithm> 8  9 using namespace std;10 11 int main()12 {13     int N, M,t;14 15     cin >> N >> M;16 17     int *p = new int[N];18 19     for (int i = 0; i < N; i++)20         cin >> p[i];21 22     M = M%N;//防止M大於N的情況出現,導致地址訪問出錯23 24     //演算法關鍵25     reverse(p, p +N- M);26     reverse(p + N - M, p + N);27     reverse(p, p + N);28 29     for (int i = 0; i < N; i++)30     {31         if (i == 0)32             cout << p[0];33         else34             cout << " " << p[i];35     }36 37     delete[] p;38 39     return 0;40 }

 

PAT 乙級 1008 數組元素迴圈右移問題 (20) C++版

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.