实现Python3数组旋转的3种算法实例


Posted in Python onSeptember 16, 2020

Python3实现旋转数组的3种算法

下面是Python3实现的旋转数组的3种算法。

一、题目

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

例如:

输入: [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.尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

2.要求使用空间复杂度为 O(1) 的原地算法。

二、解题算法

解法一

以倒数第 k 个值为分界线,把 nums 截成两组再组合。因为 k 可能大于 nums 的长度(当这两者相等的时候,就相当于 nums 没有移动),所以我们取 k % len(nums),k 和 nums 的长度取余,就是最终我们需要移动的位置

代码如下:

if nums:
  k = k % len(nums)
  nums[:]=nums[-k:]+nums[:-k]

时间:64ms

假设:

nums= [1,2,3,4,5,6,7]

k =3

运行结果:

[5, 6, 7, 1, 2, 3, 4]

解法二

先把 nums 最后一位移动到第一位,然后删除最后一位,循环k次。k = k % len(nums) ,取余

代码如下:

if nums:
  k = k % len(nums)
  while k > 0:
    k -= 1
    nums.insert(0, nums[-1])
    nums.pop()

时间:172ms

假设:

nums= [1,2,3,4,5,6,7]

k =3

运行结果:

[5, 6, 7, 1, 2, 3, 4]

解法三

先把 nums 复制到 old_nums ,然后 nums 中索引为 x 的元素移动 k 个位置后,当前索引为 x+k,其值为 old_nums[x]。,所以我们把 x+k 处理成 (x+k)%len(nums),取余操作,减少重复的次数。

代码如下:

if nums:
  old_nums = nums[:]
  l = len(nums)
  for x in range(l):
    nums[(x+k) % l] = old_nums[x]

时间:64ms

假设:

nums= [1,2,3,4,5,6,7]

k =3

运行结果:

[5, 6, 7, 1, 2, 3, 4]

到此这篇关于实现Python3数组旋转的3种算法实例的文章就介绍到这了,更多相关3种算法实现Python3数组的旋转内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python扫描IP段查看指定端口是否开放的方法
Jun 09 Python
详解Python字符串对象的实现
Dec 24 Python
Ubuntu下安装PyV8
Mar 13 Python
Python采用Django开发自己的博客系统
Sep 29 Python
mac系统安装Python3初体验
Jan 02 Python
Python中 map()函数的用法详解
Jul 10 Python
python读取Excel实例详解
Aug 17 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
Python assert语句的简单使用示例
Jul 28 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
Python 私有属性和私有方法应用场景分析
Jun 19 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 Python
Python私有属性私有方法应用实例解析
Sep 15 #Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 #Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 #Python
pycharm激活方法到2099年(激活流程)
Sep 22 #Python
pycharm专业版远程登录服务器的详细教程
Sep 15 #Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 #Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 #Python
You might like
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
常用简易JavaScript函数
2009/04/09 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
js分页代码分享
2014/04/28 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
pandas通过索引进行排序的示例
2018/11/16 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
社区食品安全实施方案
2014/03/28 职场文书
社会公德演讲稿
2014/05/20 职场文书
生物技术专业求职信
2014/06/10 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
高三英语教学反思
2016/03/03 职场文书
Python之matplotlib绘制折线图
2022/04/13 Python