为何统计数组最大值个数时出错?附实现函数代码
嘿,我瞅见你写的这个统计生日蛋糕蜡烛(也就是数组最大值个数)的函数出问题了,核心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
相关产品推荐
相关产品推荐

