PAT B1008 数组元素循环右移问题

PAT B1008 数组元素循环右移问题

题目描述:

  一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

 

  输入格式:

  每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

 

  输出格式:
  在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

 

  输入样例:
  6 2
  1 2 3 4 5 6

  输出样例:
  5 6 1 2 3 4

参考代码:

 1 /***********************************************
 2 PAT B1008 数组元素循环右移问题
 3 ***********************************************/
 4 #include <iostream>
 5 #include <vector>
 6 
 7 using namespace std;
 8 
 9 int main() {
10     int vecLength = 0, moveSteps = 0;
11 
12     cin >> vecLength >> moveSteps;
13 
14     moveSteps %= vecLength;  //注意i + vecLength - moveSteps可能会超出int范围
15 
16     vector<int> numList(vecLength, 0);
17 
18     for (int i = 0; i < vecLength; ++i) {
19         cin >> numList[i];
20     }
21 
22     for (int i = 0; i < vecLength; ++i) {
23         cout << numList[(i + vecLength - moveSteps) % vecLength];
24         if (i != vecLength - 1) cout << ' ';
25     }
26 
27     return 0;
28 }

注意事项:

  1:对于这道题来说不需要将数组内的元素按照题目描述的那样进行移动,只需要按照规律输出数组中的元素即可。

  2:需要注意:直接计算i + vecLength - moveSteps得到的结果可能会超出int范围,因此可以通过“移动”moveSteps %= vecLength得到相同的效果并减小前面所说的结果。

posted @ 2019-08-21 01:12  多半是条废龙  阅读(150)  评论(0)    收藏  举报