zoukankan      html  css  js  c++  java
  • PAT-乙级-1008 数组元素循环右移问题

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

    输入格式:

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

    输出格式:

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

    输入样例:

    6 2
    1 2 3 4 5 6
    

    输出样例:

    5 6 1 2 3 4


    分析:
      对于循环移动的问题
      将移动个数所在位置左右两边分别反序,再整体反序即可
      PS:
        针对M大于N的情况,取mod(n,m)
        如果向右移动,则从右向左数M
        如果向左移动,则从左向右数M


     1 //c++
     2 #include<iostream>
     3 using namespace std;
     4 
     5 void reverse(int *a,int n);
     6 int main(){
     7     int n,m;
     8     cin>>n>>m;
     9     int array[n];
    10     for(int i=0;i<n;i++)
    11         cin>>array[i];
    12     m %= n;
    13     reverse(array,n-m);
    14     reverse(array+n-m,m);
    15     reverse(array,n);
    16     for(int i=0;i<n;i++){
    17         if(i)
    18           cout<<' ';
    19         cout<<array[i];
    20     }
    21     return 0;
    22 } 
    23 void reverse(int *a,int n){
    24   int left=0,right=n-1;
    25   while(left<right){
    26     int tmp=a[left];
    27     a[left]=a[right];
    28     a[right]=tmp;
    29     left++;
    30     right--;
    31   }
    32 }

        
  • 相关阅读:
    FJSC2020合集
    考试前注意事项
    CSP-S&&NOIP2020游记
    IOI2020集训队作业题单
    对拍程序
    Re:memset 赋值
    2019-12-29 Div.3模拟赛题解
    NOI2020 游记
    边三连通分量算法
    【题解】Code+7 教科书般的亵渎
  • 原文地址:https://www.cnblogs.com/tenjl-exv/p/9783143.html
Copyright © 2011-2022 走看看