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

转跳点:🐏  

数组的题还是普遍比较简单的,这道题我取巧了,取巧的方法看看就行,没多大意义,用了点循环队列的思想()

  其实比赛的时候,无论怎么过的都无所谓,能过就行。我直接在读入数据的时候做了手脚……。让 i 从 step 开始 到 numsize+step 结束。然后中间索引改成 i % numsize 。这样在存入的时候就完成的了移动。不过这样就违背了题目的初衷,我们在A题了之后还是老老实实的用正常的点的方法写一遍吧,毕竟咱是来练技术的。

先贴一下水过的代码

 

 1 /**
 2  * @brief  正常的方法
 3  * @note   2019/10/5
 4  * @author 杨文蓁的小迷弟 
 5  */
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 #define MAX_SIZE 110
 9 
10 int main()
11 {
12     int numsize, step;
13     int numarrays[MAX_SIZE] = {0};
14     scanf("%d %d", &numsize, &step);
15 
16     for (int i = step; i < numsize + step; i++)
17     {
18         scanf("%d", &numarrays[i % numsize]);
19     }
20 
21     for (int i = 0; i < numsize; i++)
22     {
23         printf("%s%d", 0 == i ? "" : " ", numarrays[i]);
24     }
25 
26     return 0;
27 }
看看就好

 

  其实正常的思路也很简单,写过插入排序就知道,这玩意适合从后往前操作。首先将数组的最后一个存起来,接着将让数组的前一个赋值给后一个,当循环到数组头部时,将temp给第一个位置。step有多大,就循环多少次

贴一下代码:

 1 /**
 2  * @brief  正常的方法
 3  * @note   2019/10/5
 4  * @author 杨文蓁的小迷弟 
 5  */
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 #define MAX_SIZE 110
 9 
10 int main()
11 {
12     int numsize, step;
13     int numarrays[MAX_SIZE] = {0};
14     scanf("%d %d", &numsize, &step);
15 
16     for (int i = 0; i < numsize; ++i)
17     {
18         scanf("%d", &numarrays[i]);
19     }
20 
21     for (int i = 0; i < step; ++i)
22     {
23         int temp = numarrays[numsize - 1];
24         for (int j = numsize - 1; j >= 0; --j)
25         {
26             numarrays[j] = numarrays[j - 1];
27             if (0 == j)
28             {
29                 numarrays[j] = temp;
30             }
31         }
32     }
33 
34     for (int i = 0; i < numsize; i++)
35     {
36         printf("%s%d", 0 == i ? "" : " ", numarrays[i]);
37     }
38 
39     return 0;
40 }
正常方法

  其实还有一种抠字眼的做法,他说一个数组,没说不能开大一点,那我们就开大一点,从numsize + step - 1 ~ step 做一次循环,前面0 ~ step -1在做一次循环。这个虽然有点小小浪费空间,但是其赋值次数大大缩减了,所有个人还是比较推崇最后一种的

 1 /**
 2  * @brief  正常的方法
 3  * @note   2019/10/5
 4  * @author 杨文蓁的小迷弟 
 5  */
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 #define MAX_SIZE 110
 9 
10 int main()
11 {
12     int numsize, step;
13     int numarrays[MAX_SIZE] = {0};
14     scanf("%d %d", &numsize, &step);
15 
16     for (int i = 0; i < numsize; ++i)
17     {
18         scanf("%d", &numarrays[i]);
19     }
20 
21     step %= numsize;
22     for (int i = numsize + step - 1; i > step - 1; i--)
23     {
24         numarrays[i] = numarrays[i - step];
25     }
26     for (int i = 0; i <= step - 1; i++)
27     {
28         numarrays[i] = numarrays[numsize + i];
29     }
30 
31     for (int i = 0; i < numsize; i++)
32     {
33         printf("%s%d", 0 == i ? "" : " ", numarrays[i]);
34     }
35 
36     return 0;
37 }
抠字眼

上面的两个代码记得加一步step%numsize;防止step比数组大

  

  PTA不易,诸君共勉!

posted @ 2019-10-05 19:31  秦_殇  阅读(211)  评论(0编辑  收藏  举报