Leetcode: 旋转数组

将包含 n 个元素的数组向右旋转 步。

例如,如果  n = 7 ,  k = 3,给定数组  [1,2,3,4,5,6,7]  ,向右旋转后的结果为 [5,6,7,1,2,3,4]

注意:

尽可能找到更多的解决方案,这里最少有三种不同的方法解决这个问题。


1.三次旋转:以给定步数k将list切为两段,如题

[1,2,3,4,5,6,7]= [1,2,3,4]和[5,6,7] =分别反转= [4,3,2,1]和[7,6,5]=[4,3,2,1,7,6,5]=合一起反转=[5,6,7,1,2,3,4]

class Solution:
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        step = k % n
        
        i = 0
        j = n-step-1
        while i < j:
            nums[i], nums[j] = nums[j], nums[i]
            i += 1
            j -= 1
            
        i = n-step
        j = n-1
        while i < j:
            nums[i], nums[j] = nums[j], nums[i]
            i += 1
            j -= 1

        nums.reverse()

2.切片:

class Solution:
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
 
        step = k % len(nums)
        nums[:] = nums[-step:]+nums[:-step]

3.切片too:

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

##########################################################################################

切片:


272         0 LOAD_FAST                1 (k)
              2 LOAD_GLOBAL              0 (len)
              4 LOAD_FAST                0 (nums)
              6 CALL_FUNCTION            1
              8 BINARY_MODULO
             10 STORE_FAST               2 (step)
273       12 LOAD_FAST                0 (nums)
             14 LOAD_FAST                2 (step)
             16 UNARY_NEGATIVE
             18 LOAD_CONST               1 (None)
             20 BUILD_SLICE              2
             22 BINARY_SUBSCR
             24 LOAD_FAST                0 (nums)
             26 LOAD_CONST               1 (None)
             28 LOAD_FAST                2 (step)
             30 UNARY_NEGATIVE
             32 BUILD_SLICE              2
             34 BINARY_SUBSCR
             36 BINARY_ADD
             38 LOAD_FAST                0 (nums)
             40 LOAD_CONST               1 (None)
             42 LOAD_CONST               1 (None)
             44 BUILD_SLICE              2
             46 STORE_SUBSCR
             48 LOAD_CONST               1 (None)

             50 RETURN_VALUE

##########################################################################################

我们得到了:

  • 行号(当它改变时)
  • 指令的序号
  • 当前指令的操作码
  • 操作参数(oparg),操作码用它来计算实际的参数。
  • 计算后的实际参数(圆括号内)

以第一条指令为例,:

第1列的数字(272)表示对应源代码的行数;

第2列的数字是字节码的索引;

第3列为指令本身对应的人类可读的名字,如LOAD_FAST ;

python ref 中的解释:

LOAD_FAST(var_num)
Pushes a reference to the local co_varnames[var_num] onto the stack.

第4列表示操作参数(oparg),操作码用它来计算实际的参数

第5列则是计算后的实际参数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值