初级算法_数组 --- 旋转数组

1、题目

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

2、题解

在这里插入图片描述

3、代码

(1)刚开始想使用 列表的切割、组合方法,简单明了。可是发现执行失败,本地调测通过

from typing import List


class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        return nums[-k:]+nums[:-k]

nums = [1, 2, 3, 4, 5, 6, 7]
print(Solution().rotate(nums, 3))

(2)随后想到了 删除重复序列中的重复项 代码中的pop方法,进而想到了元素插入insert,思路:把最后的元素插入最前面,然后把最后的移除。重复执行,直到k=0,第一种是用while实现:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        while k > 0 :
            nums.insert(0, nums[-1])
            nums.pop()

第二种是用for循环实现:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in range(k):
            nums.insert(0, nums[-1])
            nums.pop()

第三种理解了pop方法,它返回的是一个元素值,移除后把元素放到第一个位置。


class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in range(k):
            nums.insert(0, nums.pop())
            

(3)继续完善前面的列表切割、组合。发现 k %= len(nums) 这玩意看不懂了。跟算法大佬讨教后,发现是这么回事:
列表切割的话,我之前只考虑了 K < 列表长度的情况,K=N,K>N没考虑。这里对K取余处理,当K<N时候,取余进行列表重组,当K=N的时候,取余后为0列表保持不变,当K>N的时候,按照取余后的值进行列表切割

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        k %= len(nums)
        nums[:] = nums[-k:] + nums[:-k]

4、生活场景

旋转数据:在我面前又一排排饮料,我想要把后面几个给排到前面去。解决办法:巴拉巴拉小魔仙之术 — 元素插入之术、列表切割组合之术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿_焦

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值