JavaScript原地删除有序数组重复项的双指针解法
本文介绍如何在JavaScript中利用双指针法原地删除有序数组中的重复元素。通过定义快慢指针,在遍历过程中比较元素并修改数组,最终返回新长度。该方法严格遵循O(1)额外空间限制,无需创建新数组,适用于LeetCode等算法场景。

问题描述与约束条件
假设存在一个有序数组 nums ,任务要求在不创建新数组的情况下,原地移除其中重复出现的元素,确保每个元素仅保留一次,并返回处理后数组的有效新长度。
算法必须满足空间复杂度为 O(1) 的约束,即只能使用常数级的额外空间,并直接在原输入数组上进行修改操作。
题目说明:
为何函数返回的是整型数值,而实际输出结果却表现为数组形式?
关键点在于:输入数组是通过「引用」传递的,这意味着在函数内部对数组进行的任何修改,调用者都能直接观察到变化。
内部逻辑可理解为:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2] 解释:函数应返回新长度 2,并将原数组 nums 的前两个元素更新为 1, 2。数组中超出新长度的后续元素无需关注。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应返回新长度 5,并将原数组 nums 的前五个元素更新为 0, 1, 2, 3, 4。同样,超出新长度的元素无需处理。
注意:
-
0 <= nums.length <= 3 * 104 -
-104 <= nums[i] <= 104 - 数组
nums已按升序排列
双指针法解题思路
解题思路:
鉴于数组 nums 本身有序,且限制条件禁止创建新数组来存储去重后的结果,我们必须直接在原数组上操作。
策略是边遍历边比对,当发现不同元素时立即更新数组。为此,可采用双指针技术中的快慢指针模式,分别定义 slow 和 fast 作为两个指针变量;
初始化阶段,慢指针 slow 指向数组起始位置(即 nums[0]),快指针 fast 指向慢指针的下一位(即 nums[1])。
随着快指针 fast 向后移动,持续将 fast 指向的元素与 slow 指向的元素进行对比:
JavaScript代码实现
代码实现:
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
if(nums.length == 0){return 0;}
let slow = 0, fast = 1;
while(fast < nums.length){
if(nums[fast] != nums[slow]){
slow = slow + 1;
nums[slow] = nums[fast];
}
fast = fast + 1;
}
return slow + 1;
};至此,关于JavaScript删除有序数组中重复项的双指针解法介绍完毕。如需了解更多JS处理数组重复项的技巧,可查阅本站往期文章或继续浏览后续内容,感谢支持!
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
JS对象数组转字符串为什么推荐用JSON.stringify()
2026-11-05 09:40:31
