[leetcode刷题]面试经典150题之6轮转数字(简单)
题目
轮转数组
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
思路
-
创建辅助数组:
- 你创建了一个长度和
nums
一样的辅助数组n
,用来存储轮转后的结果。 n = [0] * len(nums)
初始化一个全为 0 的新数组n
。
- 你创建了一个长度和
-
处理
k
值:- 如果
k
大于数组长度len(nums)
,你用k = k % len(n)
来处理,避免轮转次数超出数组长度。这一步是必要的,因为轮转len(nums)
次后数组会回到原始状态。
- 如果
-
将最后
k
个元素放到辅助数组的开头:- 通过
n[i] = nums[len(nums) - k + i]
,你把nums
中从倒数第k
个开始的元素存放到辅助数组的前k
个位置。
- 通过
-
将剩余的元素移动到辅助数组的后面:
- 接下来,通过
n[i] = nums[i - k]
,你把数组剩余的元素移动到辅助数组中。
- 接下来,通过
-
将辅助数组拷贝回原数组:
- 最后,你通过
nums[i] = n[i]
将辅助数组n
的值拷贝回nums
中,完成数组的轮转。
- 最后,你通过
代码
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
n=[0]*len(nums)
if k>len(n):
k=k%len(n)
for i in range(k):
n[i]=nums[len(nums)-k+i]
for i in range(k,len(nums)):
n[i]=nums[i-k]
for i in range(len(n)):
nums[i]=n[i]