PTA basic 1008 数组元素循环右移问题 (20 分) c语言实现(gcc)

一个数组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


数组元素循环右移
1.核心算法 n个元素循环右移m位时, 三步走 (1).翻转前n-m项 (2).翻转后m项 (3).翻转所有元素 来源自《数据结构》--严蔚敏老师 链表章节
2.细节需要注意的地方
  2.1 M大于0,M大于N时要取余
  2.2 结尾数字不带空格,要单独输出

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 int reverse(int *a,int left,int right){
 4     int temp;
 5     while(left<right){
 6         temp=a[left];
 7         a[left++]=a[right];
 8         a[right--]=temp;
 9     }
10     return 0;
11 }
12 int main(){
13     int i,n,m;
14     scanf("%d %d",&n,&m);
15     int arr[n];
16     m=m>n?m%n:m;
17     for(i=0;i<n;i++){
18         scanf("%d",&arr[i]);
19     }
20     reverse(arr,0,n-m-1);
21     reverse(arr,n-m,n-1);
22     reverse(arr,0,n-1);
23 
24     for(i=0;i<n-1;i++){
25             printf("%d ",arr[i]);
26     }
27     printf("%d\n",arr[i]);
28     return 0;
29 }

 

posted @ 2021-04-18 23:39  keiiha  阅读(223)  评论(0编辑  收藏  举报