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中装饰器的一个妙用
Feb 08 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
运动检测ViBe算法python实现代码
Jan 09 Python
Python全栈之列表数据类型详解
Oct 01 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
Python对Tornado请求与响应的数据处理
Feb 12 Python
python tkinter 设置窗口大小不可缩放实例
Mar 04 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 Python
细说NumPy数组的四种乘法的使用
Dec 18 Python
Django如何创作一个简单的最小程序
May 12 Python
Python Pandas常用函数方法总结
Jun 15 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防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
Node.js模块加载详解
2014/08/16 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
JavaScript数据结构之二叉树的遍历算法示例
2017/04/13 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
python常见排序算法基础教程
2017/04/13 Python
浅谈django model postgres的json字段编码问题
2018/01/05 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python----数据预处理代码实例
2019/03/20 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
SQL数据库笔试题
2016/03/08 面试题
新文化运动的口号
2014/06/21 职场文书
四查四看整改措施
2014/09/19 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
MySQL优化之慢日志查询
2022/06/10 MySQL