LeetCode 189. Rotate Array代码本地正确但平台判错求助
LeetCode 189. 旋转数组提交失败问题解决
问题背景
我在LeetCode上完成189. 旋转数组问题,写了以下代码:
class Solution(object): def rotate(self, nums, k): end = len(nums) - 1 carry = [] new = [n for n in nums] for i in range(end-k+1, end+1): carry.append(nums[i]) for i in range(1, k+1): new.pop() for n in new: carry.append(n) print(carry) return carry
(冗余变量是为了排除LeetCode测试系统出现异常的可能性)
在VS Code和在线解释器中运行这段代码,结果均正确(例如第一个测试用例输出[5, 6, 7, 1, 2, 3, 4])。但在LeetCode提交时,stdout在return前一行显示正确答案,却被判定为错误,数组结果莫名改变。
题目描述(翻译)
给定一个数组,将数组中的元素向右轮转 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)吗?
问题原因
LeetCode这道题要求原地修改输入的nums数组,而非返回新数组。你的代码计算出了正确结果并返回,但没有修改原nums数组,判题系统会检查原数组的内容,因此判定错误。
修正方案
方案1:适配你的思路,修改原数组
把计算好的结果赋值回原nums数组,同时处理k大于数组长度的边界情况:
class Solution(object): def rotate(self, nums, k): n = len(nums) k = k % n # 处理k超过数组长度的情况,避免越界 # 直接拼接得到轮转后的数组 carry = nums[-k:] + nums[:-k] # 原地修改原数组 for i in range(n): nums[i] = carry[i]
方案2:原地反转法(满足进阶O(1)空间要求)
这是进阶要求的最优解法,不需要额外开辟空间:
class Solution(object): def rotate(self, nums, k): n = len(nums) k = k % n # 反转整个数组 self.reverse(nums, 0, n-1) # 反转前k个元素 self.reverse(nums, 0, k-1) # 反转剩余元素 self.reverse(nums, k, n-1) def reverse(self, nums, start, end): while start < end: nums[start], nums[end] = nums[end], nums[start] start += 1 end -= 1
原理:以示例1为例
- 反转整个数组:
[7,6,5,4,3,2,1] - 反转前3个元素:
[5,6,7,4,3,2,1] - 反转后4个元素:
[5,6,7,1,2,3,4],得到最终结果。
内容的提问来源于stack exchange,提问作者mreyeball
相关产品推荐
相关产品推荐

