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

LeetCode移除有序数组重复项Java代码本地正确但在线提交失败求助

问题分析与解决

嘿,我懂你碰到的麻烦了!你的代码本地跑能算出正确的长度,但LeetCode提交失败的核心原因是没满足题目的「原地修改」要求——LeetCode的「移除有序数组中的重复项」不光要你返回去重后元素的个数,还要求你直接修改输入的nums数组,让数组的前k个元素(k是你返回的长度)就是去重后的结果,而你的代码完全没改动原数组,只是用两个ArrayList统计了数量,这肯定过不了系统的校验。

另外提一句,你的代码还没利用数组是有序这个关键条件,用contains方法判断重复其实效率很低,对于有序数组来说,我们只需要比较相邻元素就能知道是否重复,根本不需要额外的集合。

修正后的代码

这里给你一个符合题目要求的双指针解法,原地修改数组,时间复杂度O(n),空间复杂度O(1):

class Solution {
    public int removeDuplicates(int[] nums) {
        // 数组为空的情况直接返回0
        if (nums.length == 0) {
            return 0;
        }
        // 慢指针,指向去重后数组的最后一个有效元素
        int slow = 0;
        // 快指针遍历整个数组
        for (int fast = 1; fast < nums.length; fast++) {
            // 当快指针遇到和慢指针不同的元素时
            if (nums[fast] != nums[slow]) {
                // 慢指针向前移动一位
                slow++;
                // 将快指针的元素赋值给慢指针位置
                nums[slow] = nums[fast];
            }
        }
        // 去重后的数组长度是慢指针+1
        return slow + 1;
    }
}

为什么这个解法能过?

  • 完全原地修改nums数组,没有使用任何额外的集合类
  • 利用了数组有序的特性,只需要比较相邻元素就能判断重复,效率更高
  • 返回的长度slow+1对应的就是去重后元素的个数,同时nums数组的前slow+1个元素就是去重后的结果,完全符合LeetCode的校验要求

你把这段代码提交试试,应该就能通过了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:11:46