法一:reverse逆转函数
注意:不是nums数组将指向新的地址。不是原地反转。
"""
nums=eval(input())
k=int(input())
"""
k%=len(nums)
print(id(nums))
nums[k:].reverse()
nums=nums[k:]+nums[:k]
print(id(nums))
print(nums)
法二:自己的笨方法
不更改nums数组地址,时间复杂度O(n),空间复杂度O(n)
Python3: 执行用时: 112 ms 内存消耗: 20.8 MB
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n=len(nums)
if n not in [0,1]:
k%=n
tmp=[]
for i in range(n):
tmp.append(nums[(k+i)%n])
nums[(k+i)%n]=nums[i] if i<k else tmp[i-k]
法三:reversed函数
nums=reversed(nums[:])
nums[:] = reversed(nums[:])
就这一点点不同
nums=reversed(nums[:])#重新指向别处
nums[:k]=reversed(nums[:k])
nums[k:]=reversed(nums[k:])
"""
nums[:] = reversed(nums[:])
# 或 nums.reverse()
nums[:k] = reversed(nums[:k])
nums[k:] = reversed(nums[k:])
"""
报错:
nums[:k]=reversed(nums[:k]) TypeError: 'list_reverseiterator' object is not subscriptable
法四:自定义reverse函数
64 ms 20.7 MB Python3
self.reverse(nums[:],0,len(nums)-1)
self.reverse(nums[:k],0,k-1)
self.reverse(nums[k:],k,len(nums)-1)
def reverse(nums,i,j):
while i<j:
nums[i],nums[j]=nums[j],nums[i]
i+=1
j-=1
报错:
IndexError: list index out of range
nums[i],nums[j]=nums[j],nums[i]
改进:
self.reverse(nums,0,len(nums)-1)
self.reverse(nums,0,k-1)
self.reverse(nums,k,len(nums)-1)
法五:list.extend()函数
452 ms 20.7 MB Python3
tmp=nums[:len(nums)-k]
for i in range(len(nums)-k-1,-1,-1):
del nums[i]
nums.extend(tmp)
法六:切片法。
#不能通过,数组地址变化。
nums=nums[::-1]
nums[:k]=nums[:k][::-1]
nums[k:]=nums[k:][::-1]