Python3实现数组向右旋转的三种算法详解

林见深
林见深
发布时间:2026-10-14 | 3人浏览过
原创

本文详细介绍Python3中实现数组向右旋转k个位置的三种算法。涵盖切片组合、循环插入及索引映射法,重点解析如何满足空间复杂度为O(1)的原地算法要求,并提供具体代码示例与时间性能对比,帮助开发者理解不同方案的实际应用。

Python3实现数组向右旋转的三种算法详解

Python3实现数组向右旋转的三种算法

以下展示在Python3环境下实现数组向右旋转功能的三种具体算法方案。

题目要求与示例

一、题目要求

给定一个整数数组,要求将数组中的元素整体向右移动 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 可能大于数组长度,当 k 与数组长度相等时数组实际未发生移动,因此需计算 k % len(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,随后遍历原数组。对于索引为 x 的元素,其移动后的新索引为 x+k。为避免越界,将新索引处理为 (x+k)%len(nums),通过取余操作减少重复计算次数,并将 old_nums[x] 的值赋给新位置。

具体代码实现如下:


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实现数组旋转的三种算法实例介绍完毕。如需了解更多相关算法内容,可搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表