189.旋转数组

189.旋转数组

法一: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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值