leetcode练习记录189

189. 轮转数组

class No_0189_loop_k:
    """
    题干:
        https://leetcode.cn/problems/rotate-array/
        循环位移数组k位
    解析:
        题目简单,关键是效率。python切片的翻转操作只是修改索引?, 没有赋值,效率比较高

        另外记住这个算法:整体翻转 + 局部翻转
        [1, 2, 3, 4, 5]
        [5, 4  | 3, 2, 1]
        [4, 5  | 1, 2, 3]

    """
    @staticmethod
    def sol_01_slice(nums, k):
        # 使用切片
        k %= len(nums)	# k值可能大于数组的长度,要取余处理
        nums[:k], nums[k:] = nums[-k:], nums[:-k]

    @staticmethod
    def sol_02_reverse(nums: list, k):
        k %= len(nums)
        # 整体翻转
        nums.reverse()
        # 前k个翻转
        nums[:k] = nums[:k:-1]
        # 后n-k个翻转
        nums[k:] = nums[k::-1]

    @staticmethod
    def sol_03_reverse_def(nums: list, k):

        def _reverse(left, right):
            """
            自己写翻转函数,和切片的效率做个对比
            """
            nonlocal nums
            while left < right:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
                right -= 1
        n = len(nums)
        k %= n
        _reverse(0, n-1)
        _reverse(0, k-1)
        _reverse(k, n-1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值