- 数组元素循环右移问题
- 输入格式:
- 输出格式:
- 输入样例:
- 输出样例:
- 思路分析
- 代码
- 方法二
- 解题思路
- 代码
- 我的解法
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯A**N−1)变换为(A**N−M⋯A**N−1A0A1⋯A**N−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?(**后面的是下标)
输入格式:每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:6 2 1 2 3 4 5 6 结尾无空行输出样例:
5 6 1 2 3 4 结尾无空行思路分析
代码1.接收数据 int len, move
2.在输出上下文章,先输出后面前移的数,再输出前面后移的数
#include方法二 解题思路int main() { //1.接收数据 int len,move int len, move; int i; scanf("%d%d", &len, &move); int nums[len]; for(i = 0; i < len; i++){ scanf("%d", &nums[i]); } //2.先输出后面前移的数,再输出前面后移的数 move = move % len;// ? move 可能会大于 len for(i = len - move; i < len; i++){ printf("%d ", nums[i]); } for(i = 0; i < len - move; i++){ if(i == len - move - 1) printf("%d", nums[i]); else printf("%d ", nums[i]); } }
通过对数组的多次逆置来达到循环的效果,一共对数组进行了三次逆置,所以就需要构造一个函数,这个函数既可以逆置一个数组,也可以逆置数组的部分区间。
1,先将整个数组[0,N)逆置一遍;
2,将数组的前部分区间[0,M)进行逆置;
3,将数组的后部分区间[M,N)进行逆置;
假设N=2,M=2,具体数组为nums[6]={1,2,3,4,5,6};则逆置过程如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7oIYYTvI-1633857668320)(5.png)]
代码#include我的解法void printArray(int nums[],int len); void reverseArrayPro(int nums[],int begin,int end); int main() { int len,move; int i = 0; scanf("%d%d",&len,&move); int nums[len]; for(i = 0;i < len;i++){ scanf("%d",&nums[i]); } move = move%len; reverseArrayPro(nums,0,len); reverseArrayPro(nums,0,move); reverseArrayPro(nums,move,len); printArray(nums,len); return 0; } //数组打印 void printArray(int nums[],int len){ int i=0; for(i = 0; i < len; i++){ if(i==len-1) printf("%d",nums[i]); else printf("%d ",nums[i]); } } //改进版数组就地逆置 void reverseArrayPro(int nums[],int begin,int end){ int i=0; int j=1; for(i=begin;i<(end-begin)/2+begin;i++){ int temp = nums[i]; nums[i]=nums[end-j]; nums[end-j]=temp; j++; } }
#includeint main(){ int n, m, temp, flag = 0; scanf("%d%d",&n,&m); int arr[n]; for(int i = 0; i < n; i++){ scanf("%d",&arr[i]); if(((i + m) >= 6) && (flag == 0)) { temp = i; flag = 1; } } for(int j = temp; j < n; j++){ printf("%d ",arr[j]); } for(int j = 0; j < temp; j++){ if(j == (temp - 1)){ printf("%d",arr[j]); }else{ printf("%d ",arr[j]); } } }



