给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
话不多说 直接上代码:
var removeDuplicates = function(nums) {
const n = nums.length;
if (n === 0) {
return 0;
}
let fast = 1, slow = 1;//fast代表快指针 slow代表慢指针
while (fast < n) {
if (nums[fast] !== nums[fast - 1]) {//将快指针所指向的元素与其前一位进行比较
nums[slow] = nums[fast];// 发现陌生元素,将该快指针所指向的元素给到慢指针的位置
++slow// 慢指针后移,等待下一位不重复元素到来,因为慢指针只需要关心不重复的元素,所以++slow是按需执行的
// 因为我们只需要拿出所有的不重复的元素,所以不需要考虑交换快慢指针所指向的元素,只需要保持慢指针左边的内容是不重复的即可
}
++fast;//快指针要遍历所有元素,所以++fast是必然执行的
}
return slow;// 如果我们需要返回慢指针的内容的话可以使用nums.slice(0,slow);截取一个慢指针前边的内容 并将其给定到我们指定的新数组
};
此方法仅适用于排序过后的数组