LeetCode多数元素求解代码异常排查:输入[6,6,6,7,7]输出错误
问题分析与修正
错误点说明
- 计数变量未重置:当遍历到与前一个元素不同的元素时,
count没有被重置为1,导致后续元素的计数是累加之前的数值,而非从1开始统计。比如输入[6,6,6,7,7]时,处理7元素时count继承了之前6的计数3,加1后变成4,使得map中7的计数错误为4,最终返回7而非正确的6。 - 遗漏元素计数:原循环结束后,最后一组连续元素的计数没有被存入map;同时单独出现的元素也不会被添加到map中,极端情况下(如所有元素只出现一次)会导致
Collections.max(map.values())抛出空指针异常。
修正方案
方案一:直接统计元素出现次数(更简洁稳妥)
不需要排序,直接遍历数组用map统计每个元素的出现次数,逻辑更清晰,不易出错:
import java.util.HashMap; import java.util.Map; class Solution { public int majorityElement(int[] nums) { HashMap<Integer, Integer> countMap = new HashMap<>(); // 统计每个元素的出现次数 for (int num : nums) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } int maxCount = 0; int result = -1; // 找出出现次数最多的元素 for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) { if (entry.getValue() > maxCount) { maxCount = entry.getValue(); result = entry.getKey(); } } return result; } }
方案二:修正原排序遍历逻辑
如果要保留排序的思路,需要修复计数重置和元素遗漏的问题:
import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Collections; class Solution { public int majorityElement(int[] nums) { if (nums.length == 1) { return nums[0]; } Arrays.sort(nums); int count = 1; HashMap<Integer, Integer> countMap = new HashMap<>(); int i = 0; while (i < nums.length - 1) { if (nums[i] == nums[i + 1]) { count++; i++; } else { // 存入当前元素的计数并重置count countMap.put(nums[i], count); count = 1; i++; } } // 处理最后一组连续元素 countMap.put(nums[i], count); int maxCount = Collections.max(countMap.values()); for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) { if (entry.getValue() == maxCount) { return entry.getKey(); } } return -1; } }
修正说明
- 方案一通过
getOrDefault方法简化计数逻辑,直接遍历一次数组完成统计,时间复杂度O(n),空间复杂度O(n)。 - 方案二修复了原代码的两个核心问题:遇到不同元素时重置
count,循环结束后手动存入最后一组元素的计数,确保所有元素的计数都被正确记录。
内容的提问来源于stack exchange,提问作者manav dubey
相关产品推荐
相关产品推荐

