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

基于指针语法与动态数组实现C++众数计算函数求助

修正众数计算函数的实现

我来帮你修正这个众数计算函数,先梳理下你代码里的关键问题,再给出完整的修正版本:

你的代码里的核心错误

  • 在两个counter == maxCount的分支中,你错误地写了current = modePos;——这完全搞反了逻辑,我们需要把当前统计的数值current存入modes数组的modePos位置,而不是把索引值赋值给current。
  • 初始化modes数组时,最好先填充一个不会出现在输入中的默认值(比如-1),避免残留内存垃圾值干扰结果。

修正后的完整函数代码

#include <algorithm>
#include <numeric>

int* calculateMode(int* movies, int size, int& numModes)
{
    std::sort(movies, movies + size); // 对数组进行升序排序
    int* modes = new int[size]; 
    std::fill_n(modes, size, -1); // 初始化数组为-1,避免垃圾值

    int current = *(movies + 0); // 从第一个元素开始统计
    int counter = 1;
    numModes = 1;
    int modePos = 0;
    int maxCount = 1;
    *(modes + modePos) = current; // 先存入第一个元素作为初始众数

    for (int i = 1; i < size; i++) {
        if (*(movies + i) == current) { // 当前元素和统计的数值相同
            counter++;
            if (counter > maxCount) { // 出现了出现次数更多的数值,更新众数
                std::fill_n(modes, size, -1); // 清空旧的众数数组
                modePos = 0;
                *(modes + modePos) = current;
                maxCount = counter;
                numModes = 1;
            } else if (counter == maxCount) { // 出现了另一个出现次数相同的众数
                modePos++;
                *(modes + modePos) = current; // 将当前数值存入众数数组的下一个位置
                numModes++;
            }
        } else { // 遇到新的数值,切换统计目标
            current = *(movies + i);
            counter = 1;
            if (counter == maxCount) { // 所有数值都只出现一次,全部作为众数
                modePos++;
                *(modes + modePos) = current;
                numModes++;
            }
        }
    }
    return modes;
}

验证逻辑(对应你的输入)

你的输入数据中,16和47都出现了3次,是出现次数最多的数值。修正后的函数会:

  1. 排序后遍历数组,统计到16出现3次时,更新maxCount为3,存入modes数组;
  2. 后续统计到47也出现3次时,会将47存入modes的下一个位置,同时numModes增加到2;
  3. 最终返回的modes数组前两位是16和47,符合预期输出。

内容的提问来源于stack exchange,提问作者Ricardo Aponte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:04:09