题目链接:
这个题相比较第27题,难度会更难一些,第27题是让我们删除数组中的指定元素,而这个题则是让我们删除数组中的重复项。由于重复项有很多个,所以思路也会不一样。
这个题的套路也是双指针,一个left,一个right。left用来控制交换的项和返回修改后的数组长度,而right指针则是负责遍历数组。这个题最关键的一点是交换的判定,因为有很多重复项,所以我们需要找的是前后不一致的项。因为涉及到前后的问题,我们可以给left和right赋值给1,让right和right-1去负责找不一致的项的任务。当nums[right] != nums[right-1]的时候,当前的nums[right]就和nums[left]进行交换,然后left指针增加1,而right指针是负责遍历数组的,在循环的结尾的时候负责增加1即可。
当这样遍历结束之后,nums中的0到left-1的元素都不相同,然后返回left,就是修改后的数组长度。
代码如下:
int removeDuplicates(int* nums, int numsSize){
if(numsSize == 0)
{
return 0;
}
int left = 1;
int right = 1;
while(right < numsSize)
{
if(nums[right] != nums[right-1])
{
nums[left] = nums[right];
left++;
}
right++;
}
return left;
}