【算法】【线性表】【数组】删除排序数组中的重复数字(重复次数不超过2次)
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 小结
有点意思,加油。