基于指针语法与动态数组实现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次,是出现次数最多的数值。修正后的函数会:
- 排序后遍历数组,统计到
16出现3次时,更新maxCount为3,存入modes数组; - 后续统计到
47也出现3次时,会将47存入modes的下一个位置,同时numModes增加到2; - 最终返回的
modes数组前两位是16和47,符合预期输出。
内容的提问来源于stack exchange,提问作者Ricardo Aponte
相关产品推荐
相关产品推荐

