给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
实例一:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
实例二
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
首先看题要看清楚,首先是一个排序数组,然后不要使用额外的数组空间!
方法一
思路
利用indexOf 和lastIndexOf 来判断是不是有相同的元素,如果有的话就删除掉!这种方法比较好理解!
let removeDuplicates = (nums) => {
for (var i = 0; i < nums.length; i++) {
if (nums.indexOf(nums[i]) != nums.lastIndexOf(nums[i])) nums.splice(i, 1) && i--;
};
console.log(nums);//[0, 1, 2, 3, 4]
return nums.length;// 5
}
removeDuplicates([0, 0, 1, 1, 1, 2, 2, 3, 3, 4]);
方法二(双指针)
思路:
- 创建两个指针,一个读指针,一个些指针
- 碰到相同的元素,读指针继续走
- 碰到不同的元素,写指针向前走一步
- 然后把读指针的值赋值给写指针
说的不是很懂?看下面的步骤图!
首先创建2个指针
碰到相同的元素,读指针继续走
碰到不同的元素,写指针向前走一步
然后把读指针的值赋值给写指针
碰到相同的元素,读指针继续走
碰到不同的元素,写指针向前走一步
然后把读指针的值赋值给写指针
不断的重复上面的步骤
let removeDuplicates = (nums) => {
let read = 0;
let write = 0;
while (read < nums.length) {
if (nums[read] != nums[write]) {
write++;
nums[write] = nums[read];
};
read++;
};
console.log(nums.slice(0, write + 1));//[0, 1, 2, 3, 4]
return write + 1;//5
};
removeDuplicates([0, 0, 1, 1, 1, 2, 2, 3, 3, 4]);