原题
分析题目
可以使用双指针来做
p指针是慢指针
q指针是快指针
p以及以前都是没有重复的数,p到q中间的数都是p以及之前出现的数;
当q的值等于p的值时,q往右移一位,直到p!=q
把p右移一位,再把q的值赋给p即可
图解
1.初始化
2.q第一次停下
3.赋值
4.q再次停下
5.赋值
6.q再次停下,然后赋值
根据图解可以看出
- 当q=数组长度-1时,可以结束程序然后返回
2.返回值是p+1即++p
代码
public class RemoveDuplicates {
//测试
@Test
public void test(){
int nums[]={1,1,1,2,2,2,3,3,4};
int len = removeDuplicates(nums);
System.out.println(len);
}
public static int removeDuplicates(int[] nums) {
if(nums.length<=1) return nums.length;
int p=0,q=0;
int len = nums.length;
while(q<len){
if(nums[p]!=nums[q]){//两指针所指元素不等时
++p;
nums[p] = nums[q];
}
//不等和等最后都需要移动q指针
q++;
}
return ++p;
}
}