问题描述:给定一个整数数组,长度为n,如今要求该数组循环右以m个元素。编程
例如,数组为{1,2,3,4,5,6,7,8,9},循环右移3个元素后为变成{7,8,9,1,2,3,4,5,6}数组
分析:这是我曾经参加好将来笔试时的一道编程题目,考完试后,总结了如下几种解法,给你们分享下。spa
解法一:辅助空间法,思路很简单,就是另外开辟一块和原来数组同样大小的空间。而后先把原来数组的最后面的m个元素复制到 code
新数组的前面,而后再把原来数组的前面的元素复制到新数组的后面,最后再把新数组的所有元素复制到原来的数组中,便可。blog
该方法很容易被想到,可是须要额外的辅助空间。class
解法二:三步操做法。循环
第一步:将原来数组所有反序。方法
第二步:再将前m个元素反序。总结
第三步:最后将后面的元素反序。笔试
解法二不须要额外的辅助空间,是更好的解法。
因为解法一很简单,我就再也不些具体的代码了,针对解法二,写出了以下Java代码:
1 public class Main13 { 2 public static void reverse(int a[],int i,int j){ //用来实现反序 3 int t; 4 while(i<j) 5 { 6 t=a[i]; 7 a[i]=a[j]; 8 a[j]=t; 9 i++;j--; 10 } 11 } 12 13 public static void adjust(int a[],int m){ //实现右移位 14 if(a==null){ //若是数组为空,则直接退出 15 System.out.println("数组不存在"); 16 return; 17 } 18 if(m<0 ||m>a.length){ //若是数组不合法则直接退出 19 System.out.println("m的范围不对,不合法"); 20 return; 21 } 22 reverse(a,0,a.length-1); //第一步:所有反序 23 reverse(a,0,m-1); //第二步:再反序前m个数 24 reverse(a,m,a.length-1); //第三步:最后反序后面的a.length-m个数 25 } 26 27 public static void main(String[] args) { 28 // TODO 自动生成的方法存根 29 int a[]={1,2,3,4,5,6,7,8,9}; 30 int m=3; 31 System.out.print("原数组为:"); 32 for(int i=0;i<a.length;i++) 33 System.out.print(a[i]+","); 34 System.out.println(); 35 adjust(a,m); 36 System.out.print("右移动"+m+"个后为:"); 37 for(int i=0;i<a.length;i++) 38 System.out.print(a[i]+","); 39 } 40 41 }
输出结果为:
原数组为:1,2,3,4,5,6,7,8,9,右移动3个后为:7,8,9,1,2,3,4,5,6,