从数组末尾移除三元组并保持顺序:Java代码求助
数组去重修正:移除末尾重复三元组并保持元素顺序
需求说明
给定整数数组nums,需按以下规则处理:
- 若元素在数组中出现次数≥3,仅保留该元素最靠前的
(总出现次数-3)个实例,移除末尾的重复三元组部分 - 若元素出现次数<3,全部保留
- 最终剩余元素需保持原数组中的相对顺序
示例
示例1
输入:
nums = [2,4,2,2,7,5,6,7,8,6,6,2,6,7,6]
输出:nums = [2,4,5,6,8,6]
解释:
- 2出现4次 → 保留4-3=1个(最靠前的1个)
- 7出现3次 → 保留3-3=0个(全部移除)
- 6出现5次 → 保留5-3=2个(最靠前的2个)
- 4、5、8各出现1次 → 全部保留
示例2
输入:
nums = [2,2,3,2,3,2]
输出:nums = [2,3,3]
解释:
- 2出现4次 → 保留4-3=1个(最靠前的1个)
- 3出现2次 → 全部保留
原代码问题分析
你的代码存在以下核心问题:
- 未定义变量
arr却直接使用,会触发编译错误 - 结果数组
ans长度写死为6,无法适配不同输入场景 count变量逻辑错误,没有针对每个元素独立统计次数,也未实现“保留前N个、移除末尾三元组”的规则- 双重循环的遍历逻辑完全偏离需求,仅做了无意义的元素比较
修正后的Java代码
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class RemoveTripleDuplicates { public static void main(String[] args) { int[] nums = {2,4,2,2,7,5,6,7,8,6,6,2,6,7,6}; int[] result = removeTripleDuplicatesFromEnd(nums); // 打印结果 System.out.print("输出:nums = ["); for (int i = 0; i < result.length; i++) { if (i > 0) System.out.print(","); System.out.print(result[i]); } System.out.println("]"); } public static int[] removeTripleDuplicatesFromEnd(int[] nums) { // 统计每个元素的总出现次数 Map<Integer, Integer> countMap = new HashMap<>(); for (int num : nums) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } // 计算每个元素需要保留的数量 Map<Integer, Integer> keepCountMap = new HashMap<>(); for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) { int total = entry.getValue(); keepCountMap.put(entry.getKey(), total >= 3 ? total - 3 : total); } // 遍历原数组,收集符合要求的元素 List<Integer> resultList = new ArrayList<>(); for (int num : nums) { int keepCount = keepCountMap.get(num); if (keepCount > 0) { resultList.add(num); keepCountMap.put(num, keepCount - 1); } } // 转换为int数组返回 return resultList.stream().mapToInt(Integer::intValue).toArray(); } }
代码逻辑说明
- 统计元素次数:通过
HashMap遍历数组,记录每个元素的总出现次数 - 计算保留数量:对每个元素,若总次数≥3则保留
总次数-3个,否则保留全部 - 收集结果:再次遍历原数组,遇到元素时若还有保留额度,就加入结果列表,并减少该元素的保留额度,确保只保留最靠前的符合数量的元素
- 转换数组:将结果列表转换为int数组返回
内容的提问来源于stack exchange,提问作者Sumit Odich
相关产品推荐
相关产品推荐

