【求知=>算法】旋转数组
给你一个数组,将数组中的元素向右轮转 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]
解题思路
- 使用临时数组
循环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)])
- 通过数组切片的方式
以倒数第 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]
- 通过
insert和pop的方式
先把 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()
博客来源:雨夜的博客