【算法】【线性表】删除排序数组中的重复数字(重复次数不超过2次)

发布时间 2023-12-07 08:20:19作者: 酷酷-

1  题目

给你一个排序数组 nums,在逻辑上删除其中的重复元素,返回新的数组的长度 len,使得原数组 nums 的前 len 个元素中,每个数字最多出现两次。

如果一个数字出现超过2次,则这个数字最后保留两个。

样例 1:

输入:

数组 = []

输出:

0

解释:空数组,长度为0.

样例 2:

输入:

数组 = [1,1,1,2,2,3]

输出:

5

解释:长度为 5, 数组为:[1,1,2,2,3]

2  问题

我第一遍是这么写的:

public class Solution {
    /**
     * @param A: a array of integers
     * @return : return an integer
     */
    public int removeDuplicates(int[] nums) {
        // 1、空参或者长度为0的情况
        if (nums == null || nums.length == 0) {
            return 0;
        }
        // 2、长度小于等于2的情况
        if (nums.length <= 2) {
            return nums.length;
        }
        // 3、长度大于2的情况
        // 记录要返回的索引位置,这里初始化到1的位置
        int index = 1;
        // 从第3个元素开始遍历
        // 因为数组是有序的,所以遍历的过程中判断是否出现超过两次可以是当前位置的元素与-2的位置比较
        // 如果相等说明重复次数超过两次不搭理他
        // 不相等说明要留下来
        for (int i=2; i<nums.length; i++) {
            if (nums[i] != nums[i-2]) {
                nums[index++] = nums[i];
            }
        }
        // index是索引位置 因为要返回长度所以+1
        return index+1;
    }
}

我没想懂,为啥会错呢。。。调试看了下过程数据,确实有问题。

3  正解

修正后的,index初始值从2开始,遍历的过程中位置 i 的元素应该跟 index-2 即 index 范围内的作比较:

public class Solution {
    /**
     * @param A: a array of integers
     * @return : return an integer
     */
    public int removeDuplicates(int[] nums) {
        // 1、空参或者长度为0的情况
        if (nums == null || nums.length == 0) {
            return 0;
        }
        // 2、长度小于等于2的情况
        if (nums.length <= 2) {
            return nums.length;
        }
        // 3、长度大于2的情况
        // 记录返回的数组长度,也用于遍历中的重复比较 index-2 来判断遍历的元素有没有重复超过两次的
        int index = 2;
        // 从第3个元素开始遍历
        // 因为数组是有序的,所以遍历的过程中判断是否出现超过两次可以是当前位置的元素与index-2的位置比较
        // 如果相等说明重复次数超过两次不搭理他
        // 不相等说明要留下来
        for (int i=2; i<nums.length; i++) {
            if (nums[i] != nums[index-2]) {
                nums[index++] = nums[i];
            }
        }
        // index就是要返回的长度,因为它指向的是有效数组内的下一个要保留的位置
        return index;
    }
}

4  小结

有点意思,加油。