一個數組A中存有N(>)個整數,在不容許使用另外數組的前提下,將每一個整數循環向右移M(≥)個位置,即將A中的數據由(A0A1⋯AN−1)變換爲(AN−M⋯AN−1A0A1⋯AN−M−1)(最後M個數循環移至最前面的M個位置)。若是須要考慮程序移動數據的次數儘可能少,要如何設計移動的方法?html
每一個輸入包含一個測試用例,第1行輸入N(1)和M(≥);第2行輸入N個整數,之間用空格分隔。java
在一行中輸出循環右移M位之後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。ios
6 2 1 2 3 4 5 6
5 6 1 2 3 4
實現數組右移分3步:數組
(1)將數組顛倒(2)將數組 [ 0, m ) 顛倒(3)將數組 [ m, length) 顛倒測試
注意:flex
(1)右移位數 M 可能會比元素個數 N 大,要先進行 M % N 的操做spa
(2)判斷 M 是否爲 0 設計
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 int main() 7 { 8 //先將數組倒置,而後再將數組後的M位再倒置 9 int N, M; 10 cin >> N >> M; //元素個數,後移位數 11 vector<int> v(N); 12 for (int i = 0; i < N; ++i) 13 { 14 cin >> v[i]; 15 } 16 17 M %= N; //防止M比N大 18 if (M != 0) 19 { 20 reverse(v.begin(), v.begin() + N); //第一次將全部數組倒置 21 //由1-2-3-4-5-6變成6-5-4-3-2-1 22 23 reverse(v.begin(), v.begin() + M); //第二次將部分數組倒置 24 //由6-5-4-3-2-1變成5-6-4-3-2-1 25 26 reverse(v.begin() + M, v.end()); //第三次將部分數組倒置 27 //由6-5-4-3-2-1變成5-6-1-2-3-4 28 } 29 vector<int>::iterator it; 30 31 for (it = v.begin(); it != v.end() - 1; ++it) 32 { 33 cout << *it << " "; 34 35 } 36 cout << *it; 37 return 0; 38 }
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner input = new Scanner(System.in); 6 int n = input.nextInt(); 7 int m = input.nextInt(); 8 int a[] = new int[n]; 9 int i = 0; 10 for (i = 0; i < n; i++) { 11 a[i] = input.nextInt(); 12 } 13 if (n < m) { 14 m = m % n; 15 } 16 if (n == m) { 17 for (i = 0; i < n; i++) { 18 if (i != 0) { 19 System.out.print(" "); 20 } 21 System.out.print(a[i]); 22 } 23 } else { 24 for (int j = n - m; j < n; j++) { 25 System.out.print(a[j] + " "); 26 } 27 for (int j = 0; j < n - m; j++) { 28 if (j != 0) { 29 System.out.print(" "); 30 } 31 System.out.print(a[j]); 32 } 33 } 34 } 35 }