数组元素最多保留2次重复的实现问题求助
解决数组元素最多保留2次重复的问题
你之前用HashMap统计频率后直接删除元素的思路走偏了,其实不需要删除整个元素的实例,而是要控制每个元素在结果里的出现次数不超过2次,下面给你两种实用的解决方法:
方法1:原地遍历计数(最优解)
不需要额外的哈希表,直接遍历数组,利用原数组空间原地修改,时间复杂度O(n),空间复杂度O(1):
import java.util.Arrays; public class Solution { public static int[] keepAtMostTwoDuplicates(int[] nums) { if (nums.length <= 2) return nums; // 前两个元素直接保留,从第三个开始检查 int writeIndex = 2; for (int i = 2; i < nums.length; i++) { // 只要当前元素和已保留的倒数第二个元素不同,就说明可以保留 // (如果相同,说明已经连续出现2次,再出现就是多余的) if (nums[i] != nums[writeIndex - 2]) { nums[writeIndex++] = nums[i]; } } // 截取有效长度的数组返回 return Arrays.copyOf(nums, writeIndex); } public static void main(String[] args) { int[] input = {2, 2, 2, 3, 4, 4, 5}; int[] output = keepAtMostTwoDuplicates(input); System.out.println(Arrays.toString(output)); // 输出 [2, 2, 3, 4, 4, 5] } }
方法2:改进HashMap的用法(符合你最初的思路)
如果一定要用HashMap,别直接删除元素,而是用它跟踪每个元素已经添加到结果中的次数,遍历原数组时只保留前2次出现的实例:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Solution { public static List<Integer> keepAtMostTwoDuplicates(int[] nums) { List<Integer> result = new ArrayList<>(); Map<Integer, Integer> addedCount = new HashMap<>(); for (int num : nums) { int count = addedCount.getOrDefault(num, 0); if (count < 2) { result.add(num); addedCount.put(num, count + 1); } } return result; } public static void main(String[] args) { int[] input = {2, 2, 2, 3, 4, 4, 5}; List<Integer> output = keepAtMostTwoDuplicates(input); System.out.println(output); // 输出 [2, 2, 3, 4, 4, 5] } }
为什么你的原思路不行?
你之前用map.remove()会直接删掉整个元素的所有记录,等于把该元素从结果中完全移除了,而我们需要的是保留前2次出现的实例,所以应该跟踪每个元素已保留的次数,而不是删除元素本身。
内容的提问来源于stack exchange,提问作者Sandeep Roy
相关产品推荐
相关产品推荐

