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实现合并两个数组的方法
May 16 Python
python中字典(Dictionary)用法实例详解
May 30 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
pandas中Timestamp类用法详解
Dec 11 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
Python中Numpy mat的使用详解
May 24 Python
关于Python作用域自学总结
Jun 10 Python
python yield关键词案例测试
Oct 15 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 Python
浅谈Python 中的复数问题
May 19 Python
Python实现位图分割的效果
Nov 20 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 缓冲的免费实现方法
2006/10/09 PHP
php URL编码解码函数代码
2009/03/10 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
python输出电脑上所有的串口名的方法
2019/07/02 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
物流仓储实习自我鉴定
2013/09/25 职场文书
会计与审计专业大专生求职信
2013/10/03 职场文书
物理教学随笔感言
2014/02/22 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
Python如何让字典保持有序排列
2022/04/29 Python