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



我开始使用一个名为leetcode的网站,一个问题是删除数组中的所有重复项而不创建一个新的重复项。这是 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/的问题 我的解决方案是循环并检查每个元素与下一个元素,然后如果匹配,则使用splice删除重复的元素。它可以工作,但当你有类似[1,1,1,1,1]或 [1,1,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];中的部分 有人可以这么好心地帮助我理解这个简单的代码在做什么吗? 谢谢

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

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;
}

您询问的行在res[i]nums[j]值与前一个值不同(res[i-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
}

鉴于j >= i是有保证的,我们只修改我们一直访问的数组元素,因此在我们正在读取的同一数组上写入没有害处。

最新更新