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中实现php的var_dump函数功能
Jan 21 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 Python
django创建自定义模板处理器的实例详解
Aug 14 Python
python3个性签名设计实现代码
Jun 19 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
java中的控制结构(if,循环)详解
Jun 26 Python
python字符串反转的四种方法详解
Dec 02 Python
python mysql中in参数化说明
Jun 05 Python
使用python编写一个语音朗读闹钟功能的示例代码
Jul 14 Python
Python如何实现线程间通信
Jul 30 Python
python利用appium实现手机APP自动化的示例
Jan 26 Python
详解Python描述符的工作原理
Jun 11 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中$_SERVER的详细参数与说明
2008/07/29 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
js判断输入是否为数字的具体实例
2013/08/03 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
python实现kMeans算法
2017/12/21 Python
django session完成状态保持的方法
2018/11/27 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
python移位运算的实现
2019/07/15 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
美国校园市场:OCM
2017/06/08 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
普通话演讲稿
2014/09/03 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
律师催款函范文
2015/06/24 职场文书
高中生军训感言
2015/08/01 职场文书
实例详解Python的进程,线程和协程
2022/03/13 Python
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle