標籤:格式 防止 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++版