LeetCode题解Java版——数组轮转(1)

文章介绍了一种通过嵌套循环实现整数数组按指定次数轮转的方法。首先提出问题,给出构建思路,通过将数组最后一个元素作为起点,依次与其前一个元素交换实现轮转。代码部分展示了如何定义一个静态方法进行轮转操作,并包含参数校验。最后引导读者思考反向轮转的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

抛出问题

构建思路

流程图

代码部分

引申 

抛出问题

       假设有一个整数类型的数组,为{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}。初学者可以先通过这份代码的启发,自己写写如何实现这种相反方向的轮转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值