題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808ios
每一個輸入包含一個測試用例,第1行輸入N(1≤N≤100)和M(≥0);第2行輸入N個整數,之間用空格分隔。數組
在一行中輸出循環右移M位之後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。測試
6 2 1 2 3 4 5 6
5 6 1 2 3 4
出看題目,還在想移動數組位置,循環右移,即向右移動的過程當中,超過數組邊界的元素從元素左邊補上。中間想着用臨時變量保存被覆蓋的元素,但是想着想着就出現了另外數組的身影、、、。可也正是題目的要求不容許使用另外的數組,可這該怎麼辦呢?靈機一動,其實不必真的移動元素,只要表現起來像是移動了就能夠了。稍微的「欺騙」一下計算機。只須要首先輸出第n-m個元素到第n個元素,而後再輸出第0個到第n-m個元素便可。
spa
也能夠將右移後的元素的新的下標和以前的下標作個映射。反正訪問的時候進行處理就行了,表現出來就像是右移了。邏輯映射處理爲 index += n - m 。
code
#include<iostream> using namespace std; int main() { int n = 0; int m = 0; cin >> n >> m; int number[n]; for (int i = 0; i < n; i++) { cin >> number[i]; } // 若是右移的量比較大,甚至發生了循環了一遍一遍又一遍,此時對右移的量進行處理,使其在一遍循環以內 m %= n; for (int i = n - m; i < n; i++) { cout << number[i] << " "; } for (int i = 0; i < n - m; i++) { if (i != n - m - 1) { cout << number[i] << " "; } else { cout << number[i]; } } cout << endl; return 0; }