下面是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 -= 1nums.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. python旋转数组_Python3实现旋转数组的3种算法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 使用知乎「好物推荐」功能要注意什么?怎么使用? 关注问题 知乎指南 使用知乎「好物推荐」功能要注意什么?怎么使用?
  2. C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符
  3. 牛客华为机试第6题python
  4. 错误日志这样排查,干活更得劲了!!
  5. yarn资源管理调度平台
  6. HDU 4028 The time of a day STL 模拟题
  7. 我的家计算机教学反思,《我的家》教学反思
  8. 职场七种最致命的想法
  9. 首次自动对接!美国离本土载人航天又进一步,SpaceX成功抵达国际空间站
  10. 力扣——最后一个单词的长度
  11. NodeJS+Express+MongoDB 简单实现数据录入及回显展示【Study笔记】
  12. [HNOI2015] 亚瑟王
  13. async 和 defer
  14. 西安航空计算机录取分数线,2019西安航空学院录取分数线及历年专业分数线统计表【文科 理科】...
  15. Unity3D坦克大战项目总结
  16. 百度统计 页面代码安装状态:代码未生效 解决
  17. Unity - Timeline 之 Timeline Setting(Timeline的设置)
  18. xlsx表格怎么筛选重复数据_excel表格如何筛选重复数据 在Excel表格的两列数据中提取不重复值的四种方法...
  19. Spring Framework框架起步,小白都看得懂(官翻版)!
  20. 区块链是什么通俗解释?

热门文章

  1. 关于CoordinatorLayout的用法——复杂交互的克星
  2. Vim 安装 YouCompleteMe
  3. 富文本编辑器 - wangEditor 表情
  4. Cheatsheet: 2013 09.10 ~ 09.21
  5. ajax常见问题汇总(一)
  6. activity 点击后传递数据给fragment_Fragment 的过去、现在和将来
  7. UVA 11401 Triangle Counting(详解)
  8. 【2012百度之星/初赛上】C:集合的交与并
  9. Spring Cloud与Duddo比较(非原创)
  10. python-基础day10