浅谈 Python实现三次反转解决旋转数组问题

三次反转和python切片 解决 旋转数组

  首先声明这几种方法是借鉴Leetcode题解中[吴彦祖](https://leetcode-cn.com/problems/rotate-array/solution/san-ci-fan-zhuan-fu-yi-xie-pythonicde-jie-fa-pytho/)的解法,单纯为和我一样的freshchicken做补充思路及记录用,侵删

旋转数组问题

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

示例 1:

输入: [1,2,3,4,5,6,7]k = 3
输出: [5,6,7,1,2,3,4]

三次反转

  首先说说反转,如 ‘abc‘ 反转后得 ‘cba‘。三次反转的思想是将按数组索引分别将前k个元素和后k个元素反转,再将整体数组进行反转(顺序可换) 。如要实现‘abcdefg‘旋转4次,即k = 4,那么就是将数组的前k个元素‘abc‘ 和 后k个元素‘defg‘反转。反转得到 ‘cba‘ 和 ‘gfed‘。因为是基于索引原地反转,所以原数组变为‘cbagfed‘

  最后将原数组整体反转 即得到4次旋转后的数组 ‘ defgabc ‘。可以看到成功的将后k个元素旋转到了数组

明白了原理下一步就是用代码将它实现出来

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # 给定的K为非负数,可能超出数组长度,先计算出实际旋转次数k
        n = len(nums)
        k %= n

        # 定义反转函数
        def switch(a, b):
            while (a<b):    # 从两头往中间交换
                nums[a], nums[b] = nums[b], nums[a]
                a += 1
                b -= 1
        # 三次反转
        switch(0, n-k-1)    # 反转前k个元素
        switch(n-k, n-1)    # 反转后k个元素
        switch(0, n-1)      # 反转整体
# 当然利用python的切片特性我们可以更简洁的实现反转
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        k %= len(nums)

        nums[:] = nums[:][::-1]
        nums[:k] = nums[:k][::-1]
        nums[k:] = nums[k:][::-1]

前面说过。旋转数组其实可以看为将后k个元素移动到前面来。那不考虑原地算法的前提下用python其实可以写出更简洁的代码,虽然不符合本题正统做法,但可做扩展用。

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        k %= len(nums)
        nums[:] = nums[k:] + nums[:k]

两行代码完事hh,可能这就是python的魅力吧。

原文地址:https://www.cnblogs.com/Aquish/p/12642787.html

时间: 2024-08-29 03:10:36

浅谈 Python实现三次反转解决旋转数组问题的相关文章

浅谈 Python 的 with 语句

浅谈 Python 的 with 语句 王 生辉 和 李 骅宸2011 年 12 月 02 日发布 WeiboGoogle+用电子邮件发送本页面 3 引言 with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源

浅谈 Python 程序和 C 程序的整合

源地址:http://www.ibm.com/developerworks/cn/linux/l-cn-pythonandc/ 概览 Python 是一种用于快速开发软件的编程语言,它的语法比较简单,易于掌握,但存在执行速度慢的问题,并且在处理某些问题时存在不足,如对计算机硬件系统的访问,对媒体文件的访问等.而作为软件开发的传统编程语言—— C 语言,却能在这些问题上很好地弥补 Python 语言的不足.因此,本文通过实例研究如何在 Python 程序中整合既有的 C 语言模块,包括用 C 语言

开发技术--浅谈python数据类型

开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文章中提一下.并且我自己会根据这些内容进行相应的补充与扩展. 文章定位:不是科普文,是自己对于自己学习的总结. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩. 情感:用我自己的方式,解读知识点.力求通俗易懂,完美透析知识. 正文 正文的主要内

浅谈python字符串存储形式

http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问并且给出自己现有知识有的回答.长话短说,用过python的人对于 == 和 is 应该不陌生,但是这里我还是介绍一下. ==是用来判断两个东西是否相等,比如: a = 10: b = 10: print(a == b): 输出是true: 再看一个例子: a = [1,2,3]; b = [1,2,3]; c = [1,2,4]; print

浅谈 Python 的模块导入

浅谈 Python 的模块导入 本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句相关的概念.通常,导入模块都是使用如下语句: import ... import ... as ... from ... import ... from ... import ... as ... 一般情况下,使用以上语句导入模块已经够用的.但是在一些特殊场景中,可能还需要其他的导入方式.例如 Python 还提供了 __import__ 内建函数和 importlib 模块来实现动

开发技术--浅谈Python函数

开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩. 情感:用我自己的方式,解读知识点.力求通俗易懂,完美透析知识. 正文 首先介绍函数是什么,接着走进函数,并且发现函数的高级使用方法,最后列出常用的Python的内置函数. 函数是什么? 1.函数,在代码执行的是不执行,只有在调用函数的时候才会执行. 2.函数使用

浅谈Python Web的五大框架

说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界.各种micro-framework.framework不可胜数. 尽管还有一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是由于Python Web Framework(Python Web开发框架,以下简称Python框架)太多.所以在Python社区总有关于Python框架孰优孰劣的话题,讨论的时间跨度甚至长达3-5年. Python这么多框架,能挨个玩个遍的人不多,坦白

浅谈python中的递归

python 浅谈 递归函数 最近在自学一些python,找了些资料.自己慢慢研究到了递归函数这一章,碰到个很经典的例子.汉诺塔的移动.一开始尝试自己写的时候发现,这东西怎么可能写的出来.但是看到别人写出来以后发现,这东西真的能写出来. 本着借鉴的目的想去分析一下别人写的东西.觉得很有意思想给大家分享一下,如果有误请大家指正首先大家可以先自己想想如何能写出来. 先说一下:所谓的递归,我认为就是不断重复调用.直到return 出当前的递归循环.在我拆分的过程中,大家不妨先自己想一下结果,然后看一下

浅谈Kotlin(三):类

浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 前言: 已经学习了前两篇文章,对Kotlin有了一个基本的认识,往后的文章开始深入介绍Kotlin的实战使用. 本篇介绍Kotlin中类的使用. 一.表现形式 首先看一段Java中定义类的形式,定义三个属性,每一个属性对应一个get.set方法,有一个toString()方法 /* * @author xqx * @emil [email protected] * create