此题有坑,一是在原地址更新的坑nums[:],二是注意“”轮转数组“”的坑,也就是说k可以大于n=len(nums),是一个动态的循环过程,因此每一批k=n的轮回后,又变成了重复相同数组的轮转。因此结果需要k%n 对n取余。
思路图解如下:
'''
输入: 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]
'''
#本题解答需注意一个问题:
#关于是否必须用 nums[:]:nums[:] = XX 的赋值,nums 的地址不变;
#nums = XX的赋值,nums 是新地址
#本题leetcode无需return,其自动定义的函数 的 IDE 直接调输入 nums 的地址(在def注释里写的),因此必须使用mus[:]才可以返回原地址的值
#还需注意,本题为“轮转数组”,并非为简单的切片拼接。当轮转值k>=len(nums)数组长度时候,重复回到原数组后,又进行新的一遍轮转工作
#因此,需要对k%len(nums)取余
#法一:最符合理解思路
class Solution:
def rotate(self, nums, k):
n=len(nums)
k=k % n
nums[:]=nums[n-k:]+nums[:n-k]#nums[:]=在原地址上进行覆盖修改;nums=则开辟新的地址
return nums
'''
#法二:翻转数组reverse,不开辟新内存
class Solution:
def rotate(self, nums, k):
n=len(nums)
k%= n
nums.reverse()
nums[:]=list(reversed(nums[:k]))+list(reversed(nums[k:]))
return nums
'''
if __name__=='__main__':
nums = [1, 2, 3, 4, 5, 6, 7]
#k = 3
#nums = [-1, -100, 3, 99]
#k = 2
#nums=[1,2]
k=3
a=Solution()
print(a.rotate(nums,k))