python 旋转数组 多种解题思路

leetcode 题目描述:给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 要求使用空间复杂度为 O(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]

先说说笔者拿到题目的思路 刚开始的时候没有看到有空间复制度为1的要求 觉得 这不是很简单吗 新建一个新数组依次向后移动即可 

  

不知道大家看得懂吗 就向后移几个位置然后取lens个值

上代码

 1 class Solution(object):
 2     def rotate(self, nums, k):
 3         """
 4         :type nums: List[int]
 5         :type k: int
 6         :rtype: void Do not return anything, modify nums in-place instead.
 7         """
 8         lens = len(nums)
 9         temp=nums+nums
10 
11         for i in range(lens):
12           
13             nums.insert(i,temp[((lens-k+i))])  #插入第i个位置
14             nums.pop(i+1)   #将原来第i个位置的值删除

当然了 这种方法虽然可以通过leetcode测试 但是并不满足空间O(1)的要求

看了别人的代码 列举两个比较好的方法

第一个

 1     def rotate3(self, nums, k):
 2         """
 3         :type nums: List[int]
 4         :type k: int
 5         :rtype: void Do not return anything, modify nums in-place instead.
 6         """
 7         for i in range(k):        #进行k次操作
 8             last = nums.pop()    #删除最后一个值
 9             nums.insert(0, last)   #将最后一个值 放入第一个位置
10         print(nums)

可以看到 这种方法 每次将最后一个值删除 再存入第一个位置 很巧妙利用了pop()方法

第二个

    def rotate4(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        nums[:] = nums[-(k % len(nums)):] + nums[:-(k % len(nums))]
        print(nums)

第二个 简直无敌 python的简略 无人能敌 一行搞定 

解释一下代码  如图应该很好的解释了 本质是根据k取2个区域 然后交换2个区域的顺序

原文地址:https://www.cnblogs.com/bob-jianfeng/p/10315501.html