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单链表的简单实现方法
Sep 23 Python
Python中的super用法详解
May 28 Python
python笔记:mysql、redis操作方法
Jun 28 Python
Django实现分页功能
Jul 02 Python
Python实现的建造者模式示例
Aug 06 Python
Python版名片管理系统
Nov 30 Python
使用Python脚本zabbix自定义key监控oracle连接状态
Aug 28 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
基于Python数据分析之pandas统计分析
Mar 03 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
Python快速实现一键抠图功能的全过程
Jun 29 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
NOT NULL 和NULL
2007/01/15 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
laravel学习教程之存取器
2016/07/30 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
php框架知识点的整理和补充
2021/03/01 PHP
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
通过实例解析js可枚举属性与不可枚举属性
2020/12/02 Javascript
深入理解javascript中的this
2021/02/08 Javascript
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
scrapy爬虫实例分享
2017/12/28 Python
python requests证书问题解决
2019/09/05 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
新学期教师寄语
2014/04/02 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
项目负责人岗位职责
2015/02/15 职场文书
实习生个人总结范文
2015/02/28 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
golang的文件创建及读写操作
2022/04/14 Golang