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 数组元素循环右移问题的主要内容,如果未能解决你的问题,请参考以下文章