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中的正则表达式的用法
Apr 09 Python
深入理解python try异常处理机制
Jun 01 Python
Python正则表达式使用经典实例
Jun 21 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
OpenCV图像颜色反转算法详解
May 13 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
详解python itertools功能
Feb 07 Python
Python使用re模块验证危险字符
May 21 Python
python实现图片转字符画的完整代码
Feb 21 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(1)
2006/10/09 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
2016/05/24 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
详解vue-router基本使用
2017/04/18 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
python算的上脚本语言吗
2020/06/22 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
医学生求职自荐信
2013/10/25 职场文书
见习期自我鉴定
2013/11/07 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
世界环境日活动总结
2015/02/11 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python
cypress测试本地web应用
2022/06/01 Javascript