哎,在家办公是这样的,只想躺着不想干活...
双指针,删除有序数组中重复出现的元素,使得出现超过两次的元素只出现两次。
以下是问题代码:
感觉做法把握到了,但细节处理的不够好。
int removeDuplicates(int* nums, int numsSize) {
if(numsSize <= 2){
return -1;
}
int newsize = numsSize;
int left = 0,count = 0;
for(int right = 1; right < numsSize ;right++){
if(nums[right] == nums[right-1]){
count++;
}else{
count = 0;
}
if(count < 3){
nums[left++] = nums[right];
}else{
--newsize;
}
}
return newsize;
}
下面是改正后的代码:
++ 要在前面,因为无法确定下一次是否要填进去,但是这次要填进去是确定的,所以要在加入之前 ++,有点原子操作的感觉。
int removeDuplicates(int* nums, int numsSize) {
if(numsSize <= 2){
return numsSize;
}
int newsize = numsSize;
int left = 0, count = 0;
for(int right = 1; right < numsSize; right++){
if(nums[right] == nums[right-1]){
count++;
}else{
count = 0;
}
if(count < 2){
nums[++left] = nums[right]; // 修改这里,使用++left确保正确更新left指针
}else{
--newsize;
}
}
return newsize;
}
更加复杂的代码:
int removeDuplicates(int* nums, int numsSize) {
if (numsSize <= 2) {
return numsSize;
}
int left = 2; // 左指针初始位置为2,因为允许每个元素最多出现两次
for (int right = 2; right < numsSize; right++) {
if (nums[right] != nums[left - 2]) {
// 当当前元素与左指针前第二个元素不相等时,说明该元素出现次数不超过两次
nums[left] = nums[right];
left++;
}
// 如果相等,说明该元素出现次数已经超过两次,不更新left,跳过该重复元素
}
return left;
}
因为输入的数组是有顺序的,这种方法略显赖皮不过也体现出了一些栈的思想,当然若能灵光一现也挺不错。