我开始使用一个名为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];
中的一部分可以有人帮助我理解这个简单的代码是什么在干嘛谢谢
答案 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
}
是有保证的,我们只修改我们经常访问的数组元素,因此在要读取的同一数组上进行写操作不会有任何危害。