题目
给定一个整数数组 nums,将数组中的元素向右轮转 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.length <= 10^5
-2^31 <= nums[i] <= 2^31 - 1
0 <= k <= 10^5
进阶:
尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
思路
方法一:列表的弹出与插入
利用列表的pop函数和insert函数实现,后k个数依次弹出并插入列表首部
方法二:三次翻转
首先先将整个列表翻转,再分别将下标为0-----k-1,k-----len-1这两部分分别翻转。实现移动k的效果
方法三:切片
利用python的切片进行修改
代码
方法一:列表的弹出与插入
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
l = len(nums)
k = k % l
temp = k
while(temp):
data = nums.pop()
nums.insert(0,data)
temp-=1
方法二:三次翻转
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
def reverse(nums: List[int], s: int,e:int):
while(s<e):
nums[s],nums[e] = nums[e],nums[s]
s+=1
e-=1
l = len(nums)
k = k%l
reverse(nums,0,l-1)
reverse(nums,0,k-1)
reverse(nums,k,l-1)
方法三:切片
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k = k % n
#需要注意的是这里要使用nums[:]= 实现对nums的重新赋值,对单赋值指出下标【a】,整体赋值用【:】,部分赋值给出【起始:结束下标】
#如果使用nums = 则是在这个函数内部重新定义了一个变量叫nums
#其不是在原本的nums上进行修改。当外界对nums进行读取时,读到的仍然是原本未修改的nums
nums[:] = nums[n - k:] + nums[:n - k]
标签:轮转,nums,int,99,100,189,热题,def
From: https://www.cnblogs.com/anamzingclown/p/17601440.html