将包含 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列则是计算后的实际参数。