旋转数组-python
程序员文章站
2022-06-27 20:17:40
旋转数组 给定一个数组,将数组中的元素向右移动 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] ......
旋转数组
给定一个数组,将数组中的元素向右移动 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]
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 o(1) 的 原地 算法。
解答
方案1
一个一个旋转
想象旋转数组是一个进栈出栈动作,用下标来控制进出顺序
k是要移动的次数,输入数组的长度是栈的长度,长度减去次数就是元素将要移动到位置的下标地址
k要对长度取余不出错
class solution: def rotate(self, nums, k): """ do not return anything, modify nums in-place instead. """ temp = [] l = len(nums) k = k%l for i in range(l): temp.append(nums[(i-k)]) nums[:] = temp
方案2
列表链接 数组分成两部分重新合并,
class solution(object): def rotate(self, nums, k):
""" do not return anything, modify nums in-place instead. """
k = k%len(nums)
nums[:] = nums[-k:]+nums[:-k]
方案3
使用队列
class solution(object): def rotate(self, nums, k): """ :type nums: list[int] :type k: int :rtype: none do not return anything, modify nums in-place instead. """ for _ in range(k): nums.insert(0, nums.pop())
前一个自己编写,后两个的作者编写