这一题一开始没读懂,后来逐渐清晰,主要有几点前提条件需要明确:
1.我们处理的是有序的数组,即从小到大排序,进一步而言就是,如果有重复的元素,那么他们一定都是相邻的。例如:
[0,1,2,3,3,3,3,4,4,5,6,7,8,8]
2.我们函数要返回一个整数num,num表示删除了重复元素后的数组的长度,提交代码以后,输出的是处理过后的数组的前num个数字。这一点要看leetcode官网的解释
以上面的为例子,输出应该是:
[0,1,2,3,4,5,6,7,8]
3.题目要求“原地”修改,这是可行的,因为我们的 函数接收一个数组作为参数,而数组又是“引用”类型数据,因此我们在函数内对数组进行修改,数组地址所对应的内容也会相应地被更改。不理解的话需要提前学习一下“引用类型”是什么。
4.结合例子,就能读懂题目的意思
思路:双指针,慢指针用来更新数组,快指针用来遍历数组,作比较。
代码 v_1:代码太臃肿,需要简化一下
var removeDuplicates = function (nums) {
let len = nums.length;
let i = 0;
let j = 1;
let len2 = 1;
for (; i < len && j < len; i++) {
for (; j < len; j++) {
if (nums[i] != nums[j]) {
nums[i + 1] = nums[j];
len2++;
break;
}
}
}
return len2;
};
代码v_2:
var removeDuplicates = function(nums) {
let len = nums.length;
let i = 0;
let j = 1;
for (; j < len; j++) {
if (nums[i] != nums[j]) {
i++;
nums[i] = nums[j];
}
}
return i+1;
};