给定一个数组,将数组中的元素向右移动 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