问题描述
分析
此题可用双指针的方法来解题,定义一个pre指针和next指针,初始时两个指针指向数组下标1的位置。因为无论给出的数组是什么样子的,删除重复元素之后其返回结果第一个元素都是不变的。
使用next指针循环遍历nums数组,如果nums[next - 1] != nums[next] 则说明这前后两个元素是不重复的,这时就将nums[next]赋值给nums[pre],然后pre再自增1。最终结束循环之后,所有的不重复元素将集中在数组的前面,pre指向的位置就是所有不重复元素的后一个位置,那么直接返回pre就是所有不重复元素的个数了。
代码实现
while循环版
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length == 0) //如果nums的长度为0直接返回0
return 0;
int pre = 1,next = 1;
while(next <= nums.length - 1) {
if (nums[next] != nums[next - 1]) {
nums[pre] = nums[next];
pre++;
}
next++;
}
return pre;
}
}
for循环版
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length == 0)
return 0;
int pre = 1;
for (int next = 1; next < nums.length; next++) {
if (nums[next - 1] != nums[next])
nums[pre++] = nums[next];
}
return pre;
}
}