📜  将数组旋转到左 k 个单元格 python - Java (1)

📅  最后修改于: 2023-12-03 15:09:37.268000             🧑  作者: Mango

将数组旋转到左 k 个单元格

问题:给定一个包含n个元素的数组,将这个数组向左旋转k个单元格。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [4,5,6,7,1,2,3] 解释: 向左旋转 1 步: [2,3,4,5,6,7,1] 向左旋转 2 步: [3,4,5,6,7,1,2] 向左旋转 3 步: [4,5,6,7,1,2,3]

说明: 尽可能找到更多的解决方案,这里提供了两种常见的方法。

方法一:暴力旋转

思路:每次旋转一个单元格,旋转k次即可。

Python 代码:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        for i in range(k):
            last = nums[-1]
            for j in range(len(nums)-1, 0, -1):
                nums[j] = nums[j-1]
            nums[0] = last

Java 代码:

class Solution {
    public void rotate(int[] nums, int k) {
        int length = nums.length;
        k %= length;
        int temp, previous;
        for (int i = 0; i < k; i++) {
            previous = nums[length - 1];
            for (int j = 0; j < length; j++) {
                temp = nums[j];
                nums[j] = previous;
                previous = temp;
            }
        }
    }
}
方法二:反转数组

思路:先将整个数组反转,再将前k个元素反转,最后将剩余的元素反转,得到结果。

Python 代码:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        n = len(nums)
        k %= n
        nums[:] = nums[::-1]
        nums[:k] = nums[:k][::-1]
        nums[k:] = nums[k:][::-1]

Java 代码:

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        k %= n;
        reverse(nums, 0, n - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, n - 1);
    }

    private void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}

以上两种方法均为时间复杂度为O(n),空间复杂度为O(1)的旋转方法。