给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。至少3种求解。
输入: 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]
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2skh7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码如下:
for i in range(k):
p = nums.pop()
nums.insert(0,p)
执行用时:40 ms
代码如下:
k = k % len(nums)
nums[:] = nums[-k:] + nums[:-k]
执行用时:52 ms。
以k % l 分界,翻转示例:
while k=3
1234567 原
7654321 第一次翻转
5674321 翻转0到k-1
5671234 翻转k到l-1
代码如下(示例):
def reverse(nums, start, end):
while start < end:
nums[start], nums[end] = nums[end], nums[start]
start += 1
end -= 1
l = len(nums)
k %= l
reverse(nums,0, l-1)
reverse(nums,0, k-1)
reverse(nums,k, l-1)
执行用时:32 ms
原题可以理解为,后k位移到数组的前k位,其余向后移,数值不变。创建一个新的数组,通过取模,从k的第一位开始赋值给新数组,达成一个循环。
new = nums[:]
l = len(nums)
for i in range(l):
new[i] = nums[(l-k+i)%l]
nums[:] = new[:]
还有一种与第四种类似的思想:复制一个数组,遍历这个数组,将每一位填到对应的位置中。大概是nums[(i+k)%l] = new[i].
拜了个拜。