Leetcode刷题记录26——轮转数组
题源:https://leetcode.cn/problems/rotate-array/description/?envType=study-plan-v2&envId=top-100-liked
题目描述:
思路一:
直接将数组后面需要轮转的部分和数组前面不需要轮转的部分拼接即可,有两个值得注意的点:
关键点一:k %= n —— 避免无效旋转
🔍 为什么要这么做?
因为当 k 大于数组长度 n 时,旋转 k 次和旋转 k % n 次的结果是一样的。
比如:
- 原数组是 [1,2,3,4,5],长度为 5。
- 如果 k = 7,那么 7 % 5 = 2,也就是说旋转两次就够了。
- 因为每旋转 n 次,数组就会回到原始状态。
🧠 小贴士
这个技巧不仅适用于数组旋转问题,也广泛用于循环类题目中,用来简化逻辑、提高效率。
关键点二:nums[:] = nums[-k:] + nums[:-k] —— 原地修改列表
这是本题最容易出错的地方!
❗️错误写法:
nums = nums[-k:] + nums[:-k]
这行代码只是让变量 nums 指向了一个新的列表对象,而原来的列表没有被修改。对于需要 “原地修改” 的题目来说,这样的写法会导致函数外部看不到任何变化。
✅ 正确写法:
nums[:] = nums[-k:] + nums[:-k]
这个写法会直接替换 nums 列表的内容,而不是创建一个新的列表对象。这样就能确保外部看到的是我们修改后的结果。
🧪 对比示例
a = [1,2,3,4,5]
b = a
a = [6,7,8,9,10]
print(b) # 输出 [1,2,3,4,5]a = [1,2,3,4,5]
b = a
a[:] = [6,7,8,9,10]
print(b) # 输出 [6,7,8,9,10]
代码如下:
class Solution(object):def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: None Do not return anything, modify nums in-place instead."""n = len(nums)k %= nnums[:] = nums[-k:] + nums[:-k]
执行时间如下: