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