我的解法(切片)
设一个额外的空间来储存翻转后的数组 point1:不管怎么翻转 数组都是按照原来顺序的,除了nums[k-1]与nums[k]两数不是原来的顺序,也就是找到翻转后的nums里第一个数即可找到分块在原nums进行切片 point2:注意k可能比len(nums)大 out of index range 因此 k%=len(nums)(若大于len(nums)移动的位置刚好是k%len(nums)) nums:1 2 3 4 5 n=len(nums)=5 假设k=1 nums[0]=5 pos = n-k = 4 index:0 1 2 3 4 假设k=2 nums[0] = 4 pos = n-k = 3 由此可以得出 新的数组为 nums[:] = nums[n-k:] + nums[:n-k]
代码
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
k %=n
nums[:] = nums[n-k:] + nums[:n-k]
也可以是创造新的空间储存翻转后的数组 代码
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
new_list = ['']*n
for i in range(n):
pos = (i+k)%n #确定位置 超过n时求余
new_list[pos] = nums[i]
for j in range(n):
nums[j] = new_list[j]
翻转的方法
和切片的思想类似 整体翻转后 将前后切片数组翻转成原来的顺序 前k个元素为顺序数组 后k个元素也为顺序数组 该方法基于如下的事实:当我们将数组的元素向右移动k次后,尾部 k%n个元素会移动至数组头部,其余元素向后移动 k%n个位置。 代码
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k %=n
nums[:] = nums[::-1]
nums[:k] = nums[:k][::-1] #取不到k
nums[k:] = nums[k:][::-1]
|