给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

力扣:189. 旋转数组
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

题目说有三种解法,下面给出的三种解法,比较简单通俗易懂。
第一种暴力法:

 public static int[] rotate1(int[] array,int k){
        int newK=k%array.length;
        int temp=0;
        for(int i=0;i<array.length;i++){
            //让temp先保存最后一个元素
            temp=array[array.length-1];
            //进行数组的整个一遍移动过程
            for(int j=array.length-2;j>=0;j--){
                array[j+1]=array[j];
            }
            //要将最后的元素放到首位,这样一遍才进行完成
            array[0]=temp;
        }
        return array;
    }

暴力方法的另一种,本质上还是相同的。

 public static int[] rotate2(int[] array,int k){
        int newK=k%array.length;
        while(newK>0){
            int temp=array[array.length-1];
            for(int i=array.length-1;i>0;i--){
                array[i]=array[i-1];
            }
            array[0]=temp;
            newK--;
        }
        return array;
    }

第二种方法:利用另一个数组进行辅助,重新计算每一个数字要移动到的位置,放到新的数组中去。

 public static int[] rotate(int[] array,int k){
        int newK=k%array.length;
        int[] newArray=new int[array.length];
        for(int i=0;i<array.length;i++){
            int newP=(i+newK)%array.length;
            newArray[i]=array[newP];
        }
        return newArray;
    }

第三种方法:先整体逆序,在逆序前K个,在逆序后K个

public static void rotate4(int[] arr,int k) {
        //确定移动次数
        k %= arr.length;
        //将整个数组逆序
        reserve(arr,0,arr.length - 1);
        //将前k个逆序
        reserve(arr,0,k-1);
        //从下标k到数组长度之间逆序
        reserve(arr,k,arr.length - 1);
    }
    //逆序
    public static void reserve(int[] arr,int start,int end) {
        while(start < end) {
            int tmp = arr[end];
            arr[end--] = arr[start];
            arr[start++] = tmp;
        }
    }
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页