15.轮转数组
方法1: 取余+额外数组
原数组i位 → 新数组(i+k)%n位,因此不可以写成 newarry[i] = nums[(i+k)%nums.length];
eg. [1, 2, 3, 4, 5, 6, 7, 8] k=3
i=5时,(i+k)%n=0 6应该放入0下标位置→ → newArr[(i + k) % n] = nums[i];
而错误写法意思为 0下标放入5下标位置❌
1 class Solution { 2 public void rotate(int[] nums, int k) { 3 int n = nums.length; 4 int[] newArr = new int[n]; 5 for (int i = 0; i < n; ++i) { 6 newArr[(i + k) % n] = nums[i]; 7 } 8 System.arraycopy(newArr, 0, nums, 0, n); 9 } 10 }
【力扣官服题解】
方法2: 旋转
nums = "----->-->"; k =3
result = "-->----->";
reverse "----->-->" we can get "<--<-----"
reverse "<--" we can get "--><-----"
reverse "<-----" we can get "-->----->"
1 class Solution { 2 public void rotate(int[] nums, int k) { 3 k %= nums.length; 4 reverse(nums, 0, nums.length - 1); // 整个旋转 5 reverse(nums, 0, k - 1); // 前面小段旋转 6 reverse(nums, k, nums.length - 1); //后面大段旋转 7 } 8 // 两数旋转代码 9 public void reverse(int[] nums, int start, int end) { 10 while (start < end) { 11 int temp = nums[start]; 12 nums[start] = nums[end]; 13 nums[end] = temp; 14 start += 1; 15 end -= 1; 16 } 17 } 18 }
【力扣官服题解】
方法3: 我的笨方法
把需要旋转部分【后k个】取出来tmp ,前面后移,再把tmp覆盖到前面k个。
【只能过一部份测试用例,还是不正确】
class Solution { public void rotate(int[] nums, int k) { int n = nums.length; int[] newArr = new int[k]; for(int i=0;i<k ;i++){ newArr[i]=nums[n-k+i]; } for(int i=n-k-1; i >=0;i--){ nums[i+k] = nums[i]; } for(int i=0;i<k;i++){ nums[i]=newArr[i]; } } }
nums =[-1] , k =2过不掉

浙公网安备 33010602011771号