You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为例

  1. 反转整个数组:[7,6,5,4,3,2,1]
  2. 反转前3个元素:[5,6,7,4,3,2,1]
  3. 反转后4个元素:[5,6,7,1,2,3,4],得到最终结果。

内容的提问来源于stack exchange,提问作者mreyeball

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:20:29