方法一:数组
这是我本身摸索出来的一种方法,经过对数组的屡次逆置来达到循环的效果,一共对数组进行了三次逆置,因此就须要构造一个函数,函数
这个函数既能够逆置一个数组,也能够逆置数组的部分区间。spa
1,先将整个数组[0,N)逆置一遍;code
2,将数组的前部分区间[0,M)进行逆置;blog
3,将数组的后部分区间[M,N)进行逆置;io
假设N=2,M=2,具体数组为nums[6]={1,2,3,4,5,6};则逆置过程以下图所示:class
代码以下:循环
#include<stdio.h> 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++; } }
方法二:遍历
这是我在网上看的一种方法,这种方法跟个人方法比个人方法简单许多,实际上它没有移动数组中的元素,而只是简单地改变了一下数组中元素的遍历方法
顺序,先遍历出数组中 N-M ~ N-1号元素,再遍历出0~N-M-1号元素。
代码以下:
#include<stdio.h> 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; 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]); } return 0; }