目录
抛出问题
假设有一个整数类型的数组,为{1,23,24,6,17,87},我们要实现轮转,设轮转数为3,那么轮转后得到的数组应该是{6,17,87,1,23,24},首先先想一想有什么办法实现这一功能呢?
构建思路
比较容易想到一种方法是,我们是实现最后一个元素的向后轮转,那么我们就先聚焦到数组的最后一个元素87,以数组中的元素为中心,轮转一次的结果是{87,1,23,24,6,17},想办法让最后一个元素87经历一次循环后和前一个元素17进行交换,得到新数组{1,23,24,6,87,17}。然后87再和数组中的前一个元素6,进行交换,得到{1,23,24,87,6,17},依此类推。
可以看到,如果轮转数是3,那么一次轮转,进行元素交换的次数即5,也就是数组的长度-1,是数组的最大索引5。也就是说我们要经历三次轮转,并且一次轮转要进行和数组长度一致的元素交换次数,那么我们可以使用嵌套循环来实现整个操作。
这时候还有一个小细节,需要注意:进行一次元素交换,这一动作结束后,如何保存新得到的数组,这里我提供一个思路:选择一个临时变量才存储待交换的元素。也就是说,第一次内部循环的过程中,元素87要存储到临时变量中,不断用这个临时变量和前一个元素交换,直到遍历交换完整个数组。
流程图
代码部分
选择把轮转的具体步骤统一到自己定义的方法中,并确定参数为整型数组和轮转次数。加一层参数校验的if判断。
import java.util.Arrays;
public class RotateArray02 {
//定义轮转方法,arr是一个整数数组,order是轮转次数
public static void rotate(int[] array,int order){
//先进行参数校验,保证是一个正常的数组和轮转次数
if(array==null||order<0){
throw new IllegalArgumentException("Illegal argument!");
}
//外层循环控制轮转的次数
for(int i=0;i<order;i++){
//内层循环实现从数组最后一个元素遍历到第一个元素
for(int j=array.length-1;j>0;j--){
int temp=array[j];//创建临时变量
array[j]=array[j-1];
array[j-1]=temp;
}
}
}
public static void main(String[] args){
//创建一个数组并打印初始状态
int[] array={1,23,24,6,17,87};
System.out.println("初始数组"+ Arrays.toString(array));
//调用rotate方法进行旋转
int rorationOrder=3;
rotate(array,rorationOrder);
//打印旋转后的数组
System.out.println("旋转后的数组"+Arrays.toString(array));
}
}
引申
如果基于这份代码的逻辑,想一想如何实现数组的反向轮转,即{1,23,24,6,17,87}经历一次轮转变为{23,24,6,17,87,1}。初学者可以先通过这份代码的启发,自己写写如何实现这种相反方向的轮转。