题目
解题思路
对于动态语言来说这是非常容易实现的一道题目,但是作为算法题不应该使用动态语言的优势,如直接生成对象等等
分析
- 通过两个指针来识别是否为重复项,快指针在前,慢指针在后,通过对比快慢指针的元素判断是否为重复项以及决定是否需要交换元素
- 通过将前面的元素后移/后面的元素前移这种形式达到将无关元素删除的作用
实现
第一种:
- 如果元素相等,左指针不动,右指针 + 1
- 如果元素不相等,左指针 + 1, 交换元素,右指针 + 1;
- 需要考虑边界情况
第二种:
或者觉得上面难以理解的话,可以参考另外一个思路
- 只有当左右指针的元素不相等时,左指针 + 1,交换元素,右指针 + 1,其余情况右指针 + 1
代码
TypeScript
function removeDuplicates(nums: number[]): number {
if (nums.length <= 1) return 1;
let l = 0, r = 0;
while (r < nums.length) {
while (r < nums.length && nums[l] === nums[r]) { // 右指针右移,考虑边界情况
r++;
}
r === nums.length ? 0 : nums[++l] = nums[r++] // 不相等时,左指针+1,交换元素,右指针+1,需要考虑边界情况
}
return l + 1;
};
function removeDuplicates(nums: number[]): number {
if (nums.length <= 1) return 1;
let l = 0, r = 0;
while (r < nums.length) {
if (nums[l] !== nums[r]) {
nums[++l] = nums[r]
}
r++;
}
return l + 1;
};