【算法】【线性表】【数组】删除排序数组中的重复数字(重复次数不超过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 小结
有点意思,加油。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了