【求知=>算法】旋转数组

208 阅读2分钟

【求知=>算法】旋转数组

给你一个数组,将数组中的元素向右轮转 k个位置,其中 k是非负数。

示例 1:

输入: nums = [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:

输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]

解题思路


  1. 使用临时数组

循环nums数组,判断数组的长度是偶数还是奇数,每个元素都要往后移k位,如果超过数组的长度就从头开始,所以这里根据长度的奇偶数判断使用(i + k+1) % length(i + k) % length来计算重新赋值的元素下标。

nums = [1,2,3,4,5,6,7]
k = 3

# nums = [-1,-100,3,99]
#
# k = 2
new_nums = []

# 使用临时数组
# 11-(11/2)*2 模运算
for n in range(len(nums)):
    if len(nums) % 2 ==0: # 总数的奇偶性
        new_nums.append(nums[(n + k) % len(nums)])
    else:
        new_nums.append(nums[(n + k + 1) % len(nums)])
  1. 通过数组切片的方式

以倒数第 k 个值为分界线,把 nums 截成两组再组合。因为 k 可能大于 nums 的长度(当这两者相等的时候,就相当于 nums 没有移动),所以我们取 k % len(nums),k 和 nums 的长度取余,就是最终我们需要移动的位置。

nums = [1,2,3,4,5,6,7]
k = 3

# nums = [-1,-100,3,99]
#
# k = 2

k %= len(nums)
nums[:] = nums[len(nums) - k:] + nums[:len(nums) - k]

  1. 通过insertpop的方式

先把 nums 最后一位移动到第一位,然后删除最后一位,循环k次。k = k % len(nums) ,取余。

nums = [1,2,3,4,5,6,7]
k = 3

# nums = [-1,-100,3,99]
#
# k = 2

k %= len(nums)
while k >0:
    k -= 1
    nums.insert(0,nums[-1])
    nums.pop()

博客来源:雨夜的博客