WELCOME TO Pluto134340小行星

清风湿润,茶烟轻扬。

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 }
View Code

【力扣官服题解】

 

方法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];
        }

    }
}
View Code
nums =[-1] , k =2过不掉

 

posted @ 2026-01-16 10:53  Pluto134340  阅读(0)  评论(0)    收藏  举报