力扣中189 旋转数组

解析:数组反转

 

 

 

 

 

分开两部分 因为后面的部分是需要取余的会反转到前面的 所以其实这也是可以理解的

 

最开始发现对于只有一个元素的移动时 会出现索引异常 更改添加了tail需要小于长度 还是报错 看题解才发现是因为对于k>n的出错 所以 :

还有就是123--312--231--123  旋转n次会 回归到最初状态 因此这个k应该经过处理 除n取余

 

 

public void rotate(int[] nums, int k) {
        k=k%nums.length;
        reverse(nums,0,nums.length-1);
        reverse(nums,0,k-1);
        reverse(nums,k,nums.length-1);
        
    }
    public void reverse(int[] nums, int head,int tail) {
        while(head<tail){  
            int temp=nums[head];
            nums[head]=nums[tail];
            nums[tail]=temp;
            head++;
            tail--;
        }
    }

 

 

 

最开始的思路是直接从0开始进行替换,算出对应位置,例如1到3,3到5,5到1,这样循环回到最开始,过程中要保存当前位置上的,要么会覆盖。

然后发现形如这个例子的2和4的替换就没有执行到,认为这种方法不合理,看了下题解二就是这个说法。

题解二说最小移动次数是n和k的最大公约数 n是个数 k是移动步数【这还不懂】 先记住

 

 

 

 

 

开新数组移动

克隆数组:    

 

 

public static void rotate(int[] nums, int k) {
//        int[] numstemp=nums;//这么写会指向同一片内存导致出错
        int size = nums.length;
        int[] numstemp=new int[size];
        //克隆数组
//        for(int i=0;i<size;i++) {
//            numstemp[i]=nums[i];
//        }
        System.arraycopy(nums,0,numstemp,0,size);
        for(int i=0;i<size;i++) {
            nums[(i+k)%size]=numstemp[i];
        }
    }

 

 一个一个移动 移k次 报错 当只有一个元素

public static void rotate(int[] nums, int k) {
        for(int i=0;i<k;i++) {
            int temp = nums[0];
            for(int j=nums.length-1;j>0;j--) {
                nums[(j+1)%nums.length]=nums[j];
            }
            nums[(0+1)%nums.length]=temp; } }

 

posted @ 2023-02-21 11:33  Ssshiny  阅读(33)  评论(0)    收藏  举报