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抓取豆瓣图片并自动保存示例学习
Jan 10 Python
python类装饰器用法实例
Jun 04 Python
常用python编程模板汇总
Feb 12 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
python字符串反转的四种方法详解
Dec 02 Python
使用python绘制cdf的多种实现方法
Feb 25 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 Python
Python使用DFA算法过滤内容敏感词
Apr 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 file_get_contents设置超时处理方法
2013/09/30 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
php json转换相关知识(小结)
2018/12/21 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
Python通过命令开启http.server服务器的方法
2017/11/04 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
python列表list保留顺序去重的实例
2018/12/14 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
什么是Python变量作用域
2020/06/03 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
python Scrapy框架原理解析
2021/01/04 Python
德国足球商店:OUTFITTER
2019/05/06 全球购物
卫校毕业生个人自我鉴定
2014/04/28 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
领导班子对照检查材料
2014/09/22 职场文书
2015元旦标语横幅
2014/12/09 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
2015年国庆节广播稿
2015/08/19 职场文书