下面是python3实现的旋转数组的3种算法。
一、题目
给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。
例如:
输入: [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]
说明:
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
假设:
nums= [1,2,3,4,5,6,7]
k =3
运行结果:
[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
假设:
nums= [1,2,3,4,5,6,7]
k =3
运行结果:
[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
假设:
nums= [1,2,3,4,5,6,7]
k =3
运行结果:
[5, 6, 7, 1, 2, 3, 4]

Python3实现旋转数组的3种算法 1相关推荐

  1. Python3实现旋转数组的3种算法

    下面是Python3实现的旋转数组的3种算法. 一.题目 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 例如: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: ...

  2. python旋转数组_Python3实现旋转数组的3种算法

    一.试题 给出一个数组,将数组中的元素往右边移动k个位置,当中k是非负数. 比如说: 输入:[1,2,3,4,5,6,7]和k=3 输出:[5,6,7,1,2,3,4] 解释: 往右边旋转1步:[7, ...

  3. 【数组】旋转数组(两种方法)

    数组 旋转数组(两种方法) 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题.你可以使用空间复杂度为 O(1 ...

  4. (旋转数组的)二分查找算法

    二分查找算法(Binary Search)是一种高效的.应用广泛的查找算法.它是一种采用分治策略的算法. 基本二分查找算法 二分查找是针对顺序存储的有序序列的:二分查找的基本思想是:将目标元素与序列中 ...

  5. 程序员面试题精选100题(42)-旋转数组的最小元素[算法]

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的 ...

  6. java 基础知识-数组的7种算法(排序、求和、最值、遍历...)

    遍历 遍历就是把这个数组的每个元素 显示出来 遍历的方法就是先定义这个数组的大小,然后用FOR循环来完成数组,例如 double[] score = new double[5];Scanner inp ...

  7. leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现

    leetcode explore 初级算法第三题,旋转数组代码实现.原题链接: 题目分析 因为题目不是很长,这里把题目贴出来: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...

  8. 算法练习day20——190411(重建二叉树、斐波那契数列、跳台阶、矩形覆盖、变态跳台阶、旋转数组的最小数字、矩阵中的路径)

    1.重建二叉树 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. preorder = [3,9,20,15,7].inorder = [9 ...

  9. 数据结构与算法--查找与排序另类用法-旋转数组中的最小数字

    查找与排序 查找 查找与排序都在程序设计中常被用到的算法.查找相对而言简单,一般都是顺序查找,二分查找,哈希表查找,和二叉排序树查找.其中二分查找是我必须熟悉的一种. 哈希表和二叉排序树主要点在于他的 ...

  10. C++旋转数组(三种解法详解)

    题目链接:旋转数组 题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 附加要求 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 你可以使用空间复杂度为 ...

最新文章

  1. 如何运行一个Java文件?
  2. java工具配置_Java™ 教程(配置实用工具)
  3. python的一个小原理
  4. php-fpm的pool - 慢执行日志 - 进程管理 - open_basedir
  5. shiro 的 @RequiresPermissions 注解使用
  6. Win2008R2创建虚拟路由
  7. SpringMVC_Controller注解与RequestMapping
  8. 什么是康奈尔笔记法?
  9. linux从入门到精通(第2版)pdf
  10. HFSS印刷偶极子天线(2)
  11. 一般论文发表流程有哪些
  12. HTML+CSS大作业: 个人网站设计——个人网站(7页) 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码DW学生个人网站制作成品下载
  13. 一种基于自动机的快速分词方法
  14. 在大厂,我和同事搞对象(别人的故事总是这么香)
  15. 咸达医药数据库--介绍
  16. 解读CUDA Compiler Driver NVCC - Ch.2 - Compilation Phases
  17. 8086汇编基础 debug mov al,'a'或者mov ax,'ab'错误的
  18. 26、BDS B1I电文处理实现
  19. 项目4.1 -- 广义表的原子统计
  20. 【五子棋AI循序渐进】发布一个完整的有一定棋力的版本(含源码)

热门文章

  1. Linux文件类型 扩展名的作用
  2. laravel-excel文档翻译笔记
  3. 《零基础入门学习Python》学习过程笔记【32,33,34异常处理】(没看)
  4. Enable SSH Server
  5. Silverlight实用窍门系列:58.Silverlight中的Binding使用(三)-数据集合的绑定
  6. 手机网站与普通网站的不同
  7. 客户端js服务端互相调用
  8. Java中split方法对结尾空字符串不正确处理的解决方案
  9. 简述Python类中的 __init__、__new__、__call__ 方法
  10. Scala笔记2——IDE配置、函数式编程核心概念