问题描述:给定一个整数数组,长度为n,现在要求该数组循环右以m个元素。
例如,数组为{1,2,3,4,5,6,7,8,9},循环右移3个元素后为变成{7,8,9,1,2,3,4,5,6}
分析:这是我曾经参加好未来笔试时的一道编程题目,考完试后,总结了以下几种解法,给大家分享下。
解法一:辅助空间法,思路很简单,就是另外开辟一块和原来数组一样大小的空间。然后先把原来数组的最后面的m个元素复制到
新数组的前面,然后再把原来数组的前面的元素复制到新数组的后面,最后再把新数组的全部元素复制到原来的数组中,即可。
该方法很容易被想到,但是需要额外的辅助空间。
解法二:三步操作法。
第一步:将原来数组全部反序。
第二步:再将前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,
时间: 2024-10-12 16:55:51