Python实现的旋转数组功能算法示例


Posted in Python onFebruary 23, 2019

本文实例讲述了Python实现的旋转数组功能算法。分享给大家供大家参考,具体如下:

一、题目

给定一个数组,将数组中的元素向右移动 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]

说明:

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,击败了98%

附:本机测试示例代码:

# -*- coding:utf-8 -*-
nums= [1,2,3,4,5,6,7]
k =3
if nums:
  k = k % len(nums)
  nums[:]=nums[-k:]+nums[:-k]
print(nums)

运行结果:

[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,击败了16%

附:本机测试示例代码:

# -*- coding:utf-8 -*-
nums= [1,2,3,4,5,6,7]
k =3
if nums:
  k = k % len(nums)
  while k > 0:
    k -= 1
    nums.insert(0, nums[-1])
    nums.pop()
print(nums)

运行结果:

[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,击败了98%

附:本机测试示例代码:

# -*- coding:utf-8 -*-
nums= [1,2,3,4,5,6,7]
k =3
if nums:
  old_nums = nums[:]
  l = len(nums)
  for x in range(l):
    nums[(x+k) % l] = old_nums[x]
print(nums)

运行结果:

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
python3 打印输出字典中特定的某个key的方法示例
Jul 06 Python
python序列化与数据持久化实例详解
Dec 20 Python
如何通过python实现全排列
Feb 11 Python
python使用pyecharts库画地图数据可视化的实现
Mar 25 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 Python
Python学习之os包使用教程详解
Mar 21 Python
Django中celery的使用项目实例
Jul 07 Python
Python实现求两个数组交集的方法示例
Feb 23 #Python
Python神奇的内置函数locals的实例讲解
Feb 22 #Python
Python玩转Excel的读写改实例
Feb 22 #Python
Python操作配置文件ini的三种方法讲解
Feb 22 #Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 #Python
python调用虹软2.0第三版的具体使用
Feb 22 #Python
Python实现图片转字符画的代码实例
Feb 22 #Python
You might like
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python递归函数实例讲解
2019/02/27 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
纪律教育学习月活动总结
2014/08/27 职场文书
工作检讨书怎么写
2015/01/23 职场文书
行政答辩状范文
2015/05/21 职场文书
会议营销主持词
2015/07/03 职场文书
2015年暑期见闻
2015/07/14 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
运动员代表致辞
2015/07/29 职场文书
化工生产实习心得体会
2016/01/22 职场文书
赞美教师的句子
2019/09/02 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技