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在多玩图片上下载妹子图的实现代码
Aug 13 Python
Python 正则表达式(转义问题)
Dec 15 Python
Python3访问并下载网页内容的方法
Jul 28 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
浅谈django三种缓存模式的使用及注意点
Sep 30 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
django模板获取list中指定索引的值方式
May 14 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
一篇文章教你用python画动态爱心表白
Nov 22 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框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
php写app用的框架整理
2019/09/29 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
浅析node.js中close事件
2014/11/26 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
前端性能优化及技巧
2016/05/06 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
python实现百度关键词排名查询
2014/03/30 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
基于python 凸包问题的解决
2020/04/16 Python
Django ORM filter() 的运用详解
2020/05/14 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
怎样比较两个类型为String的字符串
2016/08/17 面试题
几道数据库的概念性面试题
2014/05/30 面试题
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
会计人员岗位职责
2014/03/19 职场文书
财务人员担保书
2014/05/13 职场文书
初三数学教学反思
2016/02/17 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python