Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目
描述:
给你一个升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
比如给定数组[0, 0, 2, 3, 3, 3, 5, 5], 应该返回4,数组前四位为:0,2,3,5
难度:简单
链接
著作权归领扣网络所有。
二、思路分析:
1、原地修改,限制不可再新建一个数组,要在原有数组上操作。若无该限制,前端的常规操作估计是 Array.from(new Set(nums))。
2、由于数组升序排列,故重复元素必然连续出现。不会出现 index 为 i 的元素和 i-1 元素不相同,但却与 i - n 相同的情况。可作为出现新元素的判断。
故遍历整个数组,每当出现与前一个元素不相同的新元素时,返回计数值 res 加 1,同时把 nums[res - 1] 的值赋值为当前新元素。
三、AC 代码:
/**
* @param {number[]} nums
* @return {number}
*/
const removeDuplicates = function(nums) {
let len = nums && nums.length;
if(len) {
let p = 0;
for(let i=1; i < len; i++) {
if (nums[i] !== nums[p]) {
p++;
nums[p] = nums[i];
}
}
return p + 1;
} else {
return 0;
}
};
四、总结:
快慢指针,快指针 i 用于遍历,慢指针 p 处理数组值 + 计数。