题目来源:力扣(旋转数组)
解题思路:
注意:当k值大于数组长度时,轮转多圈,可以先将k%len(nums)来求余减少轮转次数
方法一:辅助数组
利用辅助数组辅助解题,轮状k个位置,可以先将后k个位置的数据存于辅助数组内,再将原数组从剩下的数据移动到后方,再将辅助数组内的数据传入原数组的前k位置。(内存占用高,但思路简单直接)
方法二:多次反转
先将全部数组反转,将后k个数据转移到前k的位置,之后再分别反转前k个数据和后k个数据,调回顺序。
方法三:切片相接(python3)
讲数组切为前部和后部(长度k),再将前部拼接到后部尾上,以完成反转。
代码实现:
法一:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
n = len(nums)
k %= n
tmp = nums[n - k:].copy()
for i in range(n - k - 1, -1, -1):
nums[i + k] = nums[i]
for i in range(0, k):
nums[i] = tmp[i]
法二:. - 力扣(LeetCode)原位变化,用nums[:]未改变地址
length = len(nums)
k %= length
nums[:] = nums[::-1]
nums[:k] = nums[:k][::-1]
nums[k:] = nums[k:][::-1]
法三:
if k := (k % len(nums)):
nums[:k], nums[k:] = nums[-k:], nums[:-k]。