Leetcode
题目要求
给定一个排序数组,你需要在原地删除重复出现的元素,使每个元素最多出现两次,返回移除后数组的新长度
不要使用额外的数组空间,你必须在原地修改输入数组并在O(1)额外空间的条件下完成
- 示例1.给定 nums = [1,1,1,2,2,3]
- 函数应该返回新长度length = 5,并且原数组的前五个元素被修改为1,1,2,2,3
- 你不需要考虑数组中超出新长度后面的元素
- 示例2.给定 nums = [0,0,1,1,1,1,2,3,3]
- 函数应该返回新长度length = 7,并且原数组的前七个元素被修改为0,0,1,1,2,3,3
- 你不需要考虑数组中超出新长度后面的元素
核心思想
这里的核心思想是扫描替换,利用两个坐标指针,实现数组元素的更新。替换也可以改为互换,但对于本题目要求,没必要进行此操作。
完整代码如下
public class Solution {
public int replaceTwo(int[] nums){
if(nums.length <= 2) {
return nums.length;
}
//1,1,1,2,2,3
int count = 1;
//count为元素重复次数
int k = 1;
//核心思想是替换,将元素重复次数大于2的部分忽略,将其他合法元素移动到前面合法区域。
//这里用i和k同时进行扫描,但是,当元素count不小于2时,(即两数相等次数达到2,也就是说相同元素达到3时)
//这时,k会停下,直到i找到下一个与当前k-1指向当元素不相等的那一个坐标,才继续进行替换,重复所有操作。
for(int i = 1; i < nums.length; i++){
//如果相等,则重复次数加1
if(nums[i] == nums[i-1]) {
if(count < 2) {
//当重复达到两次时,才进行变换操作
nums[k++] = nums[i];
count++;
}
}else {
//如果遇到两数不想等。则情况count次数
count = 1;
nums[k++] = nums[i];
}
}
return k;
}
public static void main(String[] args) {
Solution sl = new Solution();
int nums1[] = {0,0,1,1,1,2,3,3};
int nums2[] = {0,0,1,1,1,2,3,3};
int len1 = sl.replaceTwo(nums1);
int len2 = sl.replaceTwo(nums2);
for(int i = 0;i < len1; i++){
System.out.print(nums1[i] + " ");
}
System.out.println();
for(int j = 0;j < len2; j++){
System.out.print(nums2[j] + " ");
}
}
}