码不停题: 旋转数组

76 阅读1分钟

题目链接 简述: 输入一个数组nums, 整数k, 将数组向右轮转k个位置.

python:

class Solution(object):
    def rotate(self, nums, k):
        l = len(nums)
        if k>l:
            k = k%l
        nums[:] = nums[l-k:] + nums[:l-k]

image.png

解析:

  1. nums[:]

    参考<Python学习手册>, 采取 list = 方式给列表赋值, 并不是修改list本身, 而是修改list指针指向的内存地址, 并不符合题目要求的在原处修改数组.

  2. nums[l-k:] + nums[:l-k]

    思想: 向右轮转k个位置, 在草稿本上简单演算可证明出就是将右侧k个元素切片放到左侧. 注意: python中的切片是左闭右开区间.

  3. if语句

    考虑到k可能大于列表长度, 所以操作存在周期性: 即次数等于列表长度整数倍的操作相当于没操作, 列表没有被改变, 于是采用取余法, 将周期剔除, 留下余数步骤, 才是真正有用(有影响的)轮转步骤.