将包含 n 个元素的数组向右旋转 k 步。
例如,如果 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列则是计算后的实际参数。
本文介绍了如何通过三种不同方法实现数组的向右旋转操作:利用三次旋转实现原地修改、使用切片操作进行简单直接的替换,以及另一种利用切片的实现方式。这些方法适用于不同场景,有助于理解数组操作的基本原理。
804

被折叠的 条评论
为什么被折叠?



