我试图理解为什么我对这个问题的解决方案只能部分起作用。
问题:
给出排序后的数组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”吗?
输出屏幕截图:
答案 0 :(得分:4)
在迭代数组时拼接数组时,整个数组将就地更改 。例如,假设索引0和1是重复项(i为1)。然后,如果从数组中删除索引1,则以前在索引2处的内容现在将在索引1处,而以前在索引3处的内容现在将在索引2处,依此类推。
因此,当元素被删除时,您需要从i
中减去1,否则下一个元素将被跳过。
您还犯了一个错误-将i
从1
迭代到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;
}