LeetCode第26题代码无法通过,请求分析问题原因
有序数组去重代码问题排查
你的代码存在的核心问题
- 不符合题目要求的返回格式:绝大多数此类算法题(比如LeetCode第26题)要求原地修改输入的原数组,并返回去重后的数组长度,而非返回一个新数组。测试用例会检查原数组的内容是否被正确修改,而非你返回的新数组。
- 对象遍历顺序无保障:使用
for...in遍历对象时,ECMAScript标准并未保证键的遍历顺序。虽然对于纯正整数键的对象,现代浏览器可能按数字顺序遍历,但这不是绝对的(比如数组包含负数时顺序会混乱),而原数组是有序的,依赖对象遍历顺序会导致结果不可靠。 - 空间复杂度冗余:你的代码额外使用了对象和新数组,空间复杂度为O(n),而题目通常期望使用O(1)的额外空间完成操作。
修正后的代码(双指针法,原地修改)
var removeDuplicates = function(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]; } } return slow + 1; };
修正思路说明
- 双指针逻辑:
- 慢指针
slow始终指向去重后数组的最后一个有效元素位置。 - 快指针
fast遍历整个原数组,当遇到与slow指向元素不同的值时,将slow后移一位,并把fast对应的值赋给slow的位置。
- 慢指针
- 原地修改:直接在原数组上覆盖重复元素,无需额外存储空间。
- 返回值正确:返回
slow + 1即为去重后的数组长度,原数组的前slow + 1个元素就是去重后的有序结果。
内容的提问来源于stack exchange,提问作者tuc94
相关产品推荐
相关产品推荐

