1008. 数组元素循环右移问题 (20)

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

输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格分隔。

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

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

思路:题目明确规定了,不能开辟新数组并且要使其实现所需的步骤最少;首先创建一个swap函数用以交换两个变量;然后使用翻转思想即可实现数组的循环右移(见注释)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 
 5 void swapNum(int* a, int* b)
 6 {
 7     *a = *a ^ *b;
 8     *b = *a ^ *b;
 9     *a = *a ^ *b;
10 }
11 
12 int main()
13 {
14     int N,M,M1;
15     scanf("%d%d",&N,&M1);
16     int arr[N];
17     M = M1%N;//此处是一个小坑,由于M并无上界,要考虑到其超出N的情形 
18     for(int i=0; i<N; i++)
19     {
20         scanf("%d",&arr[i]);
21     }
22     //1.第一次reverse
23     for(int i=N-1, j=0; i>j; i--,j++)
24     {
25         swapNum(&arr[i], &arr[j]);
26     }
27     //2.第二次reverse
28     for(int i=M-1,j=0; i>j; i--,j++)
29     {
30         swapNum(&arr[i],&arr[j]);        
31     } 
32     //3.第三次reverse
33     for(int i=N-1,j=M; i>j; i--,j++)
34     {
35         swapNum(&arr[i],&arr[j]);    
36     } 
37     //4.输出
38     for(int i=0; i<N; i++)
39     {
40         if(i!=N-1)    
41             printf("%d ",arr[i]);
42         else 
43             printf("%d",arr[i]);
44     }
45     return 0;
46 }

 

posted @ 2016-12-09 22:30  ValarMorghulis  阅读(195)  评论(0编辑  收藏  举报