zoukankan      html  css  js  c++  java
  • 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个区域的顺序

  • 相关阅读:
    计算机网络
    一行代码实现字符串逆序输出
    移动前端开发初涉篇【2014/03/25】
    小识闭包【2013/07/18】
    [转载]IE6Bug之躲猫猫【2013/10/29】
    关于maven仓库镜像
    关于spring resttemplate超时设置
    关于springboot访问多个mysql库
    关于Java基础类型自动装箱(autoboxing)
    关于Java(JDBC连接数据库)
  • 原文地址:https://www.cnblogs.com/bob-jianfeng/p/10315501.html
Copyright © 2011-2022 走看看