为什么我的Remove Duplicates from Sorted Array解法部分用例不通过
问题原因
你写的代码存在两个核心错误:
splice方法参数使用错误:Array.splice()的第一个入参是待删除元素的索引位置,你当前传入的是nums[i + 1]也就是元素值,当元素值和索引碰巧一致时(比如前几个测试用例的0、1、2)会误打误撞正常运行,一旦元素值和索引不匹配就会删错位置,这就是你遇到3重复的核心原因。- 数组长度动态变化后索引逻辑错误:删除元素后数组长度会自动减1,你没有对循环变量i做回溯处理,会直接跳过删除后新移动到当前i+1位置的元素,导致部分重复项漏检。
修复后的遍历版本
const removedDuplicates = (nums) => { for (let i = 0; i < nums.length; i++) { if (nums[i] === nums[i + 1]) { // 第一个参数传索引i+1,不是元素值 nums.splice(i + 1, 1); // 删除后i回退1,下一轮循环还是检查当前位置,避免漏判 i--; } } return nums.length; };
更符合题目要求的快慢指针解法(时间复杂度O(n),避免splice的高开销)
题目要求原地修改、O(1)额外空间,用双指针法性能更高,可通过最大规模测试用例:
const removeDuplicates = (nums) => { if(nums.length === 0) return 0; // 慢指针指向最后一个不重复元素的位置 let slow = 0; for(let fast = 1; fast < nums.length; fast++) { // 快指针找到和慢指针不一样的元素时,慢指针后移,赋值新元素 if(nums[fast] !== nums[slow]) { slow++; nums[slow] = nums[fast]; } } // 慢指针+1就是不重复元素的个数k return slow + 1; };
内容的提问来源于stack exchange,提问作者rookie_developer
相关产品推荐
相关产品推荐

