给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。
不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。
您在真实的面试中是否遇到过这个题?
样例
给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public class Solution {
/*
* @param nums: An ineger array
* @return: An integer
*/
public static int removeDuplicates(int[] nums){
if(nums.length==0) return 0;
int i=0;
int index;
int count=1;
for(index=0;index<nums.length;index++)
{
if(nums[i]!=nums[index])
{
nums[++i]=nums[index];
//注意++i,i++区别 ++i是先自增再赋值
//i++是先赋值再自增
count++;
}
}
return count;
}
}
思路
可以使用快慢指针,当数字相同时快指针后移,当数字不同时先移动慢指针再赋值。
那么这道题的解题思路是,我们使用快慢指针来记录遍历的坐标,最开始时两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,这样当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数