力扣中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; } }
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号