描述
設將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中所存放的序列。每兩個數之間用空格分隔。 輸入樣例
輸入樣例 1
5 1 2 3 4 5 1 6 -1 2 3 2 4 3 3 0
輸出樣例 1
2 3 4 5 1 2 4 3 -1 2 3
因為要求盡量降低時空復雜度,
將數組R循環左移p位后,前p個數一定移動到后面,而后n-p移動到前面,因此可先將數組R逆置,然后再將R中前n-p個元素原地逆置,再將后p個元素原地逆置
用REVERse函數來進行實現。這樣,上述算法中三個Reverse函數的時間復雜度分別為O(n/2)、O((n-p)/2)和O(p/2),故所設計的算法的時間復雜度為O(n),空間復雜度為O(1)。最為快捷
#include<iostream> using namespace std; void Reverse(int r[], int begin, int end) { int i, temp; for (i = 0; i < (end - begin + 1) / 2; i++) { temp = r[begin + i]; r[begin + i] = r[end - i]; r[end - i] = temp; } } int main() { while (1) { int r[10000]; int n,position; cin >> n; if (n == 0) break; for (int i = 0; i < n; i++) cin >> r[i]; cin >> position; Reverse(r, 0, n - 1); Reverse(r, 0, n - 1 - position); Reverse(r, n - position, n - 1); for (int i = 0; i < n ; i++) { if (i == n - 1) cout << r[i] << endl; else cout << r[i] << ' '; } } }