【来源】
1008. 数组元素循环右移问题 (20)
【分析】本题要求在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置。
博主刚开始的思路是直接模拟数组循环移动的过程,然后输出最终状态的数组。后来发现过程非常繁琐,经好友提醒,恍然大悟,原来只需要控制输出的东西就行了,管它数组本身有没有真的循环移动了。因此思路如下:
移动的位置若为N的整数倍,数组不会发生改变,所以只需计算offset=M%N。然后考虑数组后几位移动到了前几位,前几位移动到后几位,依次输出即可。
【源码】
#include <iostream>
using namespace std;
int main()
{
int m, n;
cin >> n >> m;
int* nums = new int[n];
for (int i = 0; i < n; ++i){
cin >> nums[i];
}
int offset = m % n;
if (offset == 0){
cout << nums[0];
for (int i = 1; i < n; ++i){
cout << " " << nums[i];
}
}
else{
cout << nums[n - offset];
for (int i = 1; i < offset; ++i){
cout << " " << nums[i + n - offset];
}
for (int i = 0; i < n - offset; ++i){
cout << " " << nums[i];
}
}
return 0;
}
【点评】
本题为简单的模拟题。解题的过程中获得了如下启示:充分、透彻理解题意以后再去码代码,会事半功倍。