给定一个整数数组 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]
“modify nums in-place instead”,指的是原位变化
实际上我们的变量都是一个对象,这个对象拥有两个基本属性——value和id,value就是变量里存储的值,id就是变量的实际存储的内存地址,根据这个内存地址我们就可以找到对应的变量数据,这就是关键所在了:原位修改指的是运行完毕后,nums的id地址不变,也就是说,一切会导致nums最后id改变的实现方式都是错误的,因为leetcode编译器会直接去读取原始的内存地址中存储的数据,如果你新建了nums变量,在新的id地址上实现了效果,但是很不幸,没用,因为原来id地址上的内容完全没改变,所以你的结果还是原来的模样,未曾改变半分,所以这也是很多人明明print(nums)看到了数据改变,但是编译器显示nums未曾改变的原因。
python:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 方法一
# for i in range(k):
# nums.insert(0,nums.pop())
# 方法二
length=len(nums)
k%=length
# 原地赋值先将nums全部颠倒
nums[:]=nums[::-1]
# 将nums前k个倒转
nums[:k]=nums[:k][::-1]
# 将k后面倒转
nums[k:]=nums[k:][::-1]