问题描述:给定一个整数数组,长度为n,现在要求该数组循环右以m个元素。
例如,数组为{1,2,3,4,5,6,7,8,9},循环右移3个元素后为变成{7,8,9,1,2,3,4,5,6}
分析:这是我曾经参加好未来笔试时的一道编程题目,考完试后,总结了以下几种解法,给大家分享下。
解法一:辅助空间法,思路很简单,就是另外开辟一块和原来数组一样大小的空间。然后先把原来数组的最后面的m个元素复制到
新数组的前面,然后再把原来数组的前面的元素复制到新数组的后面,最后再把新数组的全部元素复制到原来的数组中,即可。
该方法很容易被想到,但是需要额外的辅助空间。
解法二:三步操作法。
第一步:将原来数组全部反序。
第二步:再将前m个元素反序。
第三步:最后将后面的元素反序。
解法二不需要额外的辅助空间,是更好的解法。
由于解法一很简单,我就不再些具体的代码了,针对解法二,写出了如下Java代码:
public class Main {
public static void reverse(int a[],int i,int j){ //用来实现反序
int t;
while(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
i++;j--;
}
}
public static void adjust(int a[],int m){ //实现右移位
if(a==null){ //如果数组为空,则直接退出
System.out.println("数组不存在");
return;
}
if(m<0 ||m>a.length){ //如果数组不合法则直接退出
System.out.println("m的范围不对,不合法");
return;
}
reverse(a,0,a.length-1); //第一步:全部反序
reverse(a,0,m-1); //第二步:再反序前m个数
reverse(a,m,a.length-1); //第三步:最后反序后面的a.length-m个数
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
int a[]={1,2,3,4,5,6,7,8,9};
int m=3;
System.out.print("原数组为:");
for(int i=0;i<a.length;i++)
System.out.print(a[i]+",");
System.out.println();
adjust(a,m);
System.out.print("右移动"+m+"个后为:");
for(int i=0;i<a.length;i++)
System.out.print(a[i]+",");
}
}
输出结果为:
原数组为:1,2,3,4,5,6,7,8,9,
右移动3个后为:7,8,9,1,2,3,4,5,6,