Leetcode每日一题-数组去重

2,368 阅读2分钟

题目描述

  1. 删除排序数组中的重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

好好读题

这道题要好好读题,我一开始新建了个新数组用来存储不重复数字,然后各种运行错误,又找不出bug,心累。

由题目摘出重点:

  1. 函数调用之后 原数组长度不变
  2. 不能新建一个数组存储 删除重复数据后的数组,因为空间复杂度要求为 O(1)
  3. 根据修改替换原数组重复元素 和 返回长度 动态遍历出 不准新建的新数组里应该有的元素

解答

方法一:使用arr.splice()

var removeDuplicates = function (nums) {
    for (let i = 0; i < nums.length; i++) {
        let j = i + 1;
        while (nums[i] === nums[j]) {
            nums.splice(j, 1);
        }
    }
    return nums.length;
};

splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。

语法:array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

实例:

const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// inserts at index 1
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "June"]

months.splice(4, 1, 'May');
// replaces 1 element at index 4
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "May"]

方法二:双指针法

可以这样理解:创建一个新的数组,当遇到旧数组的指针与当前数值指针值不一致时,赋值给新的数组。双指针的方法是巧妙的用一个数组代替了两个数组赋值的方式。

数组遍历完后 返回 r+1 (为什么加1?因为是索引位置,而题目要求返回的是长度)

var removeDuplicates = function (nums) {
    if (nums.length === 0) {
        return 0;
    }
    let j = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] !== nums[j]) {
            j++;
            nums[j] = nums[i];
        }
    }
    return j + 1;
};

参考:leetcode题解