从排序数组JS中删除重复项

时间:2020-10-12 20:36:53

标签: javascript arrays

我试图理解为什么我对这个问题的解决方案只能部分起作用。

问题

给出排序后的数组num,就地删除重复项,以使每个元素仅出现一次并返回新的长度。

不要为另一个数组分配额外的空间,必须通过使用O(1)额外的内存就地修改输入数组来做到这一点。

我的解决方案:

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

这是我在leetcode上得到的结果,但是我不明白为什么我的解决方案停止工作并且未删除“ 3”吗?

输出屏幕截图:

image of the screenshot

5 个答案:

答案 0 :(得分:4)

在迭代数组时拼接数组时,整个数组将就地更改 。例如,假设索引0和1是重复项(i为1)。然后,如果从数组中删除索引1,则以前在索引2处的内容现在将在索引1处,而以前在索引3处的内容现在将在索引2处,依此类推。

因此,当元素被删除时,您需要从i中减去1,否则下一个元素将被跳过。

您还犯了一个错误-将i1迭代到i < nums.length,这样就不会越过数组末尾。

您还需要传递 index 来删除到splice,而不是 value 来删除。

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

答案 1 :(得分:1)

简单版本。使用已经创建的功能

let array = new Set(nums);
let values = array.values();
return Array.from(values);

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这在常量内存上也可以通过:

const removeDuplicates = function (nums) {
    
    let count = 0;
    
    nums.forEach(function (num) {
        if (num !== nums[count]) {
            nums[++count] = num;
        }
    });
    
    return nums.length && count + 1;
};

答案 4 :(得分:0)

C#简单解决方案:

public int RemoveDuplicates(int[] nums) {
        if (nums.Length == 0)
                return 0;
        var i = 0;
            var start = 0;
            var end = 0;

            while (end < nums.Length)
            {
                if (nums[start] != nums[end])
                {
                    nums[++i] = nums[end];
                    start = end;
                }
                end++;
            }

            return i + 1;
    }
相关问题