首页 > 编程语言 >3种算法实现Python3数组的旋转

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

时间:2024-12-27 17:25:58浏览次数:15  
标签:old nums len 旋转 算法 数组 Python3

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

下面是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]

标签:old,nums,len,旋转,算法,数组,Python3
From: https://blog.csdn.net/hakesashou/article/details/144774063

相关文章

  • 手撕算法-严刑拷打
    题目背景:给定m台“相同”机器(或工作线程、工人等),以及n个“任务”或“工作”,每个任务都有一个执行时间。我们需要将这n个任务分配到这m台机器上,使得所有任务都执行完所需的总时间(完工时间)最小,即要找出一个最优的分配方案,让“最后一台机器”完成任务的时间尽可能早。......
  • 【Leetcode刷题随笔】977 有序数组的平方
    1.题目描述给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9,16,100]2.解题方法2.1方法一:直接排序最......
  • 模拟退火算法
    模拟退火方法,全称为模拟退火算法(SimulatedAnnealing,SA),是一种基于概率的通用优化算法,其思想来源于固体退火原理。以下是对模拟退火方法的详细解释:一、基本原理模拟退火算法模拟了物理中固体退火的过程来搜索问题的最优解。在固体退火过程中,固体被加热至高温后缓慢冷却,内部粒子从......
  • 后缀数组(SA)
    后缀数组(SA)本文参考OIWiki。后缀数组(SuffixArray)主要关系到两个数组:\(sa\)和\(rk\)。我们称后缀\(i\)表示后缀\([i,n]\)。其中\(sa_i\)表示排名为\(i\)的后缀是什么,\(rk_i\)表示后缀\(i\)的排名。\(sa\)和\(rk\)是互逆的。字符串比较规则是逐位比较,空位小......
  • 算法网关视频分析网关小知识:如何对视频分析系统实施冗余设计以提高稳定性?
    在城市交通管理中,视频分析系统扮演着至关重要的角色,它不仅需要实时监控和分析交通流量,还需要在各种复杂环境下保持稳定运行。为了确保视频分析系统在面对设备故障、网络中断、电源波动等不可预见情况时仍能保持高可用性,实施冗余设计成为了提高系统稳定性的关键策略。以下是一些有......
  • K-means算法分析与实践
    一、聚类分析概述定义:根据“物以类聚”原理,将本身尚未归类的样本根据多个维度(属性)聚集成不同的组,这样的一组数据对象的集合叫做簇或群组。经过聚类划分后的群组特性目标:属于同一群组的样本之间彼此足够相似;属于不同群组的样本应该足够不相似;聚类与分类的区别:聚类没......
  • 代码随想录算法训练营第五十九天|dijkstra(堆优化版)精讲、Bellman_ford
    前言打卡代码随想录算法训练营第49期第五十九天⚆_⚆(˘❥˘)(•̀⌓•)シ(人•͈ᴗ•͈)♡♡首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的......
  • Java 数组
    1.何为数组(Array)定义:数组是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过数组下标或索引的方式对这些数据进行统一管理。例如全班同学的数学成绩就可以构成一个数组。特点:数组属于引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据......
  • 使用js写一个方法将一个正整数分解质因数,输出为数组
    你可以使用以下的JavaScript函数来将一个正整数分解为质因数,并将结果输出为数组:functionprimeFactors(n){letfactors=[];letdivisor=2;//判断输入是否为正整数if(n<=0||!Number.isInteger(n)){thrownewError('Inputmustbeapo......
  • 源码编译基于python3的cv_bridge
    源码位于工作空间visual下的ros_cv_bridgeubuntu20.04原生python版本就是python3,故直接用下列命令编译即可:catkin_make-DPYTHON_EXECUTABLE=$(whichpython)若编译过程中出现boost报错,把CMake文件中的boost改成python3即可find_package(PythonLibs)if(PYTHONLIBS_VERS......