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

Posted daker-code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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比数组大

  

  PAT不易,诸君共勉!

以上是关于P 1008 数组元素循环右移问题的主要内容,如果未能解决你的问题,请参考以下文章

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

B1008 数组元素循环右移问题 (20分)

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

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

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

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