import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int remove_duplicates_v3 (int[] nums) { // write code here if (nums.length == 0) return 0; int slow = 0; int count = 1; for (int fast = 1; fast < nums.length; fast++) { if (nums[fast] - nums[fast - 1] == 0) { if (count < 3) { nums[++slow] = nums[fast]; count++; } } else { nums[++slow] = nums[fast]; count = 1; } } return ++slow; } }
该代码使用的编程语言是Java。
这道题目考察的是数组的处理和快慢指针的应用。
解题思路如下:
- 首先判断数组
nums
是否为空,如果为空则直接返回0。 - 定义两个指针:
slow
和fast
,分别表示慢指针和快指针。初始时,slow
指向数组的第一个元素,count
为1。 - 从数组的第二个元素开始遍历,即
fast
从1到nums.length-1
。 - 判断当前元素与前一个元素是否相等,即
nums[fast] - nums[fast - 1] == 0
,如果相等,则说明出现了重复元素。如果 count < 3,意味着重复元素的个数不超过2个,可以将该重复元素保留在数组中。将 nums[fast] 赋值给 nums[++slow],同时 count 自增1。 - 如果当前元素与前一个元素不相等,则说明出现了新的元素。将当前元素赋值给 nums[++slow],同时重置 count 为1。
- 遍历结束后,返回
slow
的值加1,即为去除重复元素后的新数组长度。
代码的文字解释如下所示:
- 定义一个方法
removeDuplicates_v3
,接收一个整型数组nums
作为参数。 - 首先判断数组是否为空,如果是则直接返回0。
- 定义两个整型变量
slow
和count
分别初始化为0和1,用于记录新数组的指针位置和重复元素的出现次数。 - 使用循环遍历数组,从第二个元素开始比较。
- 如果当前元素与前一个元素相等,则判断重复元素的个数是否小于3,如果是则将该重复元素保留在新数组中,同时更新
slow
和count
。 - 如果当前元素与前一个元素不相等,则说明出现了新的元素,将新元素保存在新数组中,同时重置
count
。 - 循环结束后,返回新数组的长度
slow + 1
。