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

题目截图:

 

思路:

  先将整个数组逆置,然后将数组前 M 个元素和后面的元素分别逆置即可。

 

代码:

 1 /*
 2     1008. 数组元素循环右移问题
 3 */
 4 
 5 #include <stdio.h>
 6 #include <string.h>
 7 #include <math.h>
 8 #include <stdlib.h>
 9 #include <time.h>
10 
11 #define maxn 101
12 int p[maxn] = {0};
13 
14 // 逆置 
15 void swap(int a, int b) {
16     int i;
17     for(i=a; i<=(a+b)/2; ++i) {
18         int temp = p[i];
19         p[i] = p[a+b-i];
20         p[a+b-i] = temp;
21     }
22 }
23 
24 int main() {
25     int N, M, i, flag=0;
26     scanf("%d %d", &N, &M);
27     M %= N;                    // M 可能大于 N 
28     for(i=0; i<N; ++i) {
29         scanf("%d", &p[i]);
30     }
31     if(M != 0) {            // M 为 0 不需要移动 
32         swap(0, N-1);        // 逆置整个数组 
33         swap(0, M-1);        // 逆置数组前 M 个元素 
34         swap(M, N-1);        // 逆置数组后面元素 
35     }
36     for(i=0; i<N; ++i) {    // 按格式输出 
37         if(flag) {
38             printf(" ");
39         }
40         printf("%d", p[i]);
41         flag = 1;
42     }
43 
44     return 0;
45 }

 

posted @ 2018-02-25 16:15  Just_for_Myself  阅读(192)  评论(0编辑  收藏  举报