题目

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

  • 示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4]

解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
  • 示例 2:

输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100]

解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

解题思路

  1. 处理轮转次数: 如果 k 大于数组长度 n,可以通过 k = k % n 来简化轮转次数,因为每 n 次轮转数组会回到原来的状态。
  2. 反转数组: 反转整个数组。 反转前 k 个元素。 反转后 n-k 个元素。

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        k = k % n  # 处理 k 大于 n 的情况
        
        # 定义反转函数
        def reverse(start, end):
            while start < end:
                nums[start], nums[end] = nums[end], nums[start]
                start += 1
                end -= 1
                
        # 反转整个数组
        reverse(0, n - 1)
        # 反转前 k 个元素
        reverse(0, k - 1)
        # 反转后 n-k 个元素
        reverse(k, n - 1)