LeetCode 26题数组去重求助:代码返回结果不符合预期
问题排查与修正
你的代码存在三个核心问题:
- 未按要求原地修改原数组:你创建了
newArr存储去重结果,但完全没有将newArr的内容写回nums。题目明确要求修改原数组,使得前k个元素是去重后的结果,所以测试时读取nums的前k个元素自然还是原数组的重复值。 - 多余的排序操作:题目已经说明输入数组是非降序排列的,你在循环里每次调用
Arrays.sort(nums)完全没必要,既浪费性能,也不符合题目隐含的输入条件。 - 成员变量
j的不合理使用:把j定义为类的成员变量,多次调用该方法时会导致j的值累加错误,应该将其定义为方法内部的局部变量。
修正后的代码(原地去重双指针法)
class Solution { public int removeDuplicates(int[] nums) { 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]; } } return slow + 1; // 去重后的元素个数是慢指针位置+1 } }
针对测试用例nums = [1,1,2]的执行过程:
- 初始
slow=0,fast=1:nums[1]等于nums[0],跳过。 fast=2:nums[2]不等于nums[0],slow变为1,将nums[2]的值2复制到nums[1]。- 循环结束,返回
slow+1=2,此时nums的前2个元素为[1,2],完全符合预期。
内容的提问来源于stack exchange,提问作者Jayson
相关产品推荐
相关产品推荐

