天天看点

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

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

题目来源:https://leetcode-cn.com

最直观的写法:旋转一步就是将最后一个数置换到最前面(一个一个交换),然后在外部添加一个循环(步数)。

class Solution {

    public void rotate(int[] nums, int k) { 

       int temp=0;

        int length=nums.length;

        if(k%length==0)System.out.println(Arrays.toString(nums));

        if(k%length<length/2){

            for(int j=0;j<k%length;j++){

             for(int i=nums.length-1;i>0;i--){

                 temp=nums[i-1];

                 nums[i-1]=nums[i];

                 nums[i]=temp;

             }

           }

        }

     }

}

但是这样写的话运算花费的时间太长,直接提交LeetCode表示拒绝,提交结果是超时,然后我就多加了一步,就是判断步数是否大于数组的一半是的话就倒过来置换。就变成了下面这样:

int temp=0;

        int length=nums.length;

        if(k%length==0)System.out.println(Arrays.toString(nums));

        if(k%length<length/2){

            for(int j=0;j<k%length;j++){

             for(int i=nums.length-1;i>0;i--){

                 temp=nums[i-1];

                 nums[i-1]=nums[i];

                 nums[i]=temp;

             }

           }

        }else{

            for(int j=0;j<length-k%length;j++){

             for(int i=0;i<length-1;i++){

                 temp=nums[i+1];

                 nums[i+1]=nums[i];

                 nums[i]=temp;

             }

           }

        }

但是这样写提交后还是超时,然后我有了下面这种想法:

针对k的值进行批量置换,例如[1,2,3,4,5,6,7,8]步数为2,就会有如下顺序:

①对1,2跟7,8置换-->[7,8,3,4,5,6,1,2] 

②将3,4跟1,2置换-->[7,8,1,2,5,6,3,4] 

③将5,6跟3,4置换-->[7,8,1,2,3,4,5,6] 

大概有个想法但是今天没时间做了,明天研究研究。

修改版的地址:

https://blog.csdn.net/lu_wei_keke/article/details/80722103