题目地址: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; }