Follow up for "Remove Duplicates":
What if duplicates are allowed at most twice?
For example,
Given sorted array nums = [1,1,1,2,2,3],
Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3. It doesn't matter what you leave beyond the new length.
题意:有一个已经排序好的数组,如果数组中每个元素最多允许出现两次,按条件更新数组,并返回更新后的数组有效长度。
思考:这是一道followup题目,由于最多允许出现两次,所以可以增加一个计数器来检测目前是否重复次数是否已达到两次。用一个指针prePtr记录目前更新到的位置,一个游标指针来遍历数组。如果游标和游标前面的值不相等,右移prePtr并更新值;如果相等,并且重复的次数小于2,则prePtr还是可以右移并更新值的,如果次数已经大于等于2,需要等待下一个不同的值才能右移prePtr。
public int removeDuplicates(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int prePtr = 0;
int cnt = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[i-1]) {
nums[++prePtr] = nums[i];
cnt = 1;
} else {
if (cnt < 2) {
nums[++prePtr] = nums[i];
}
}
}
return prePtr + 1;
}
bug:自己做的时候比较的是游标和prePtr处的值是否相等,并且用一个布尔标志而不是计数器,在[1,1,1,1,3,3]这个case下就无法通过。因为和自己之前的元素进行比较才知道是不是连续重复。