算法每日一题(python,2024.05.21)day.3

 题目来源:力扣(旋转数组)

7bde763ca4ac4114a6f9ca0fcd688e09.png

解题思路:

注意:当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]。

总结:题目简单,但需注意优化(例如k过大时的求余)从不同角度出发可思考多种解题思路

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neophyte0608

你的鼓励将使我创作学的更加快乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值