从Javascript数组中删除重复项(无需修改数组)-了解背后的逻辑

时间:2019-03-11 21:07:03

标签: javascript arrays algorithm

我开始使用一个名为leetcode的网站,一个问题是删除一个数组中的所有重复项,而不创建一个新数组。这是问题https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/  我的解决方案是循环并根据下一个元素检查每个元素,如果匹配,请使用splice删除重复的元素。它可以工作,但是当您有[1,1,1,1,1]或[1,1,2,2,2,2,3,3]之类的东西时不起作用,所以我在github上找到了一个有效的代码:

var removeDuplicates = function(nums) {
    var i = 0;
    for (var n in nums)
        if (i === 0 || nums[n] > nums[i-1])
            nums[i++] = nums[n];
    return i;
};

此代码有效并且通过了所有160项测试,但是我不清楚自己在做什么,尤其是nums[i++] = nums[n];中的一部分可以有人帮助我理解这个简单的代码是什么在干嘛谢谢

1 个答案:

答案 0 :(得分:1)

考虑以下代码以创建新数组:

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

当值与上一个值(nums[j]不同时,您要询问的行将res[i]分配为res[i-1]的新元素,然后递增{{1} },将下一个非重复的值放在下一个位置。

现在我们使用相同的算法,但不是修改新的i数组,而是修改原始的res数组:

nums

考虑到function removeDuplicates(nums) { var i = 0; for (var j=0; j<nums.length; j++) if (i === 0 || nums[j] !== nums[i-1]) nums[i++] = nums[j]; nums.length = i; // drop the rest } 是有保证的,我们只修改我们经常访问的数组元素,因此在要读取的同一数组上进行写操作不会有任何危害。