You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode多数元素求解代码异常排查:输入[6,6,6,7,7]输出错误

问题分析与修正

错误点说明

  1. 计数变量未重置:当遍历到与前一个元素不同的元素时,count没有被重置为1,导致后续元素的计数是累加之前的数值,而非从1开始统计。比如输入[6,6,6,7,7]时,处理7元素时count继承了之前6的计数3,加1后变成4,使得map中7的计数错误为4,最终返回7而非正确的6。
  2. 遗漏元素计数:原循环结束后,最后一组连续元素的计数没有被存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:47:05