问题描述

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步:
[7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4] 示例
2:

输入: [-1,-100,3,99] 和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步:
[99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100] 说明:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 要求使用空间复杂度为 O(1) 的 原地 算法。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.基本思想

  题目要求三种方法:首先就是暴力法:每次移动一个元素并移动下字符串;第二种就是将列表反转,将题目由 “取出列表尾部元素放到列表头部元素” 变成 “从列表头部取出元素放到列表尾部”。第三种方法通过观察移动后的结果:其实元素排列顺序没发生变化,因此,可以整体移动字符串。

2.1暴力法
# -*- coding: utf-8 -*-
'''
问题简述:
    给定一个排数组,将数组中元素向右移动k个位置;
基本思路:
    首先取出最后一个元素,然后将list中前n-1个元素向右移动一位,然后将最后一个元素放到首位。
    循环k次即可。
'''
class Solution():
    def rotate(self,nums,k):
        if len(nums)<2:
            return nums
        i=0
        k = k % len(nums)
        while i<k:
            temp = nums[-1]  # 取出最后一个元素,一开始用pop()不对,因为pop是取出最后一个元素并删除!!
            nums[1:len(nums)] = nums[0:len(nums)-1] # 整体后移字符串
            nums[0] = temp
            i+=1
        return nums
if __name__ == '__main__':
    ilist = [1,2]
    k=3
    solu = Solution()
    res = solu.rotate(ilist,k)
    print('移动后list结果:',res)
2.2逆序法
# -*- coding: utf-8 -*-
'''
问题简述:
    给定一个排数组,将数组中元素向右移动k个位置;
基本思路:
    将列表反转,将问题变成从列表尾部取出元素放到头部变成从头部取出元素放到尾部。
    最后再将list反转回去即可。
'''
class Solution():
    def rotate(self,nums,k):
        if len(nums)<2:
            return nums
        i=0
        k = k % len(nums)    # 避免k值>list的长度
        nums.reverse()       # 反转list
        while i<k:
            temp = nums.pop(0) # 取出第一个元素
            nums.append(temp)
            i+=1
        nums.reverse()
        return nums
if __name__ == '__main__':
    ilist = [1,2]
    k=3
    solu = Solution()
    res = solu.rotate(ilist,k)
    print('移动后list结果:',res)
2.3整体移动法
# -*- coding: utf-8 -*-
'''
问题简述:
    给定一个排数组,将数组中元素向右移动k个位置;
简单思路:
    由于旋转后数组次序不变,比如[1,2,3,4,5],循环k=2次之后,结果为[4,5,1,2,3]。
    因此可以直接字符串切片操作。
'''
class Solution():
    def rotate(self,nums,k):
        if len(nums)<2:
            return nums
        temp = nums[len(nums)-k:] # 取出最后一段
        nums[k:] = nums[0:len(nums)-k] # 将前半段整体后移
        nums[:k] = temp
        return nums
if __name__ == '__main__':
    ilist = [1,2]
    k=3
    solu = Solution()
    res = solu.rotate(ilist,k)
    print('移动后list结果\n',res)
总结

a. pop()是将list最后一个元素取出并删除!注意:直接在list中删除掉了。
b. nums.reverse() 方法是直接将原list逆序更改了,即内存内存储变了。因此,不能写成nums = nums.reverse(),会返回一个NoneType。不能再被引用。类似的也有sort()。
c. 注意 k = k % len(nums) ;防止k比list长,反而会增加运行时间!同时有可能报错。