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

为何统计数组最大值个数时出错?附实现函数代码

嘿,我瞅见你写的这个统计生日蛋糕蜡烛(也就是数组最大值个数)的函数出问题了,核心bug出在获取vector元素数量的方式上,咱们来掰扯清楚怎么修复:

问题根源

你用了sizeof(ar) / sizeof(ar[0])来计算元素个数,但这招只对普通的C风格数组管用!vector是C++的容器对象,sizeof(ar)返回的是vector本身的内存大小(比如它内部存的指针、容量、当前元素数这些成员的总大小),根本不是所有元素的字节总数。所以这个计算出来的arraySize完全不对,要么导致循环少遍历元素,要么越界访问,结果肯定错得离谱。

修正后的基础版本

下面是修复了长度问题的代码,逻辑和你原来的一致,只是把获取元素数的方式改成了vector的标准用法:

int birthdayCakeCandles(vector<int> ar) { 
    // 用vector的size()方法获取元素个数,这才是正确姿势
    long arraySize = ar.size(); 
    long maxHeight = ar[0]; 
    long number = 0; 
    long i; 

    // 第一遍遍历找出最大值
    for (i = 0; i < arraySize; i++) { 
        if (ar[i] >= maxHeight) { 
            maxHeight = ar[i]; 
        } 
    } 

    // 第二遍统计最大值出现的次数
    for (i = 0; i < arraySize; i++) { 
        if (ar[i] == maxHeight) { 
            number++; 
        } 
    } 

    return number; 
}

更高效的优化版本(一次遍历搞定)

其实咱们可以把找最大值和统计次数合并到一次遍历里,减少一次循环,效率更高,还能处理空vector的边界情况:

int birthdayCakeCandles(vector<int> ar) { 
    // 先判断vector是否为空,避免访问ar[0]时越界
    if (ar.empty()) return 0;

    long maxHeight = ar[0]; 
    long number = 1; 

    // 用size_t作为循环变量,和ar.size()的返回类型匹配,避免警告
    for (size_t i = 1; i < ar.size(); i++) { 
        if (ar[i] > maxHeight) { 
            // 找到更大的值,更新最大值并重置计数
            maxHeight = ar[i]; 
            number = 1; 
        } else if (ar[i] == maxHeight) { 
            // 和当前最大值相等,计数加1
            number++; 
        }
    } 

    return number; 
}

这样改完之后,函数就能正确统计数组中最大值的个数啦~

内容的提问来源于stack exchange,提问作者Ishwar Joshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:17:26