缓冲区平均值计算功能测试用例失败问题排查请求
排查可变长度缓冲区平均值计算的测试失败问题
看起来你这个平均值计算功能的测试用例跑失败了,我来帮你梳理下最容易踩的几个坑,以及对应的解决办法:
最常见的问题:累加时的整数溢出
很多人会犯的错误是用和缓冲区元素相同的类型(比如char)来存储总和。你的缓冲区数据范围是-127到+127,单个元素没问题,但当size较大时,累加的总和很容易超出char的存储范围(-128到127),导致溢出后计算出错误的总和,最终平均值自然不对。
比如你最后那个7元素的测试用例:{-6,-9,-7,-8,-8,-9,-9},总和是-56,用char存还没问题,但如果遇到更大的size(比如200个127),总和是25400,远远超出char的范围,溢出后数值会完全错乱。
解决办法:用更大的类型存储总和
把总和的变量类型换成int,这样就能容纳更大范围的累加值。下面是修正后的示例代码(假设是C语言实现):
int calculate_average(int size, char* pt) { // 处理空缓冲区的错误条件,同时防御性处理负数size if (size <= 0) { return 0; } int sum = 0; // 遍历缓冲区累加所有元素 for (int i = 0; i < size; i++) { sum += pt[i]; } // 整数除法向零取整,完全符合测试用例的预期结果 return sum / size; }
其他需要排查的细节
除了溢出,还有几个小地方可能导致测试失败:
- 循环边界错误:比如循环从
i=1开始,漏掉了第一个元素;或者循环条件写成i <= size,导致越界访问缓冲区。 - 空缓冲区判断不严谨:如果代码只判断
size == 0,没处理size为负数的情况(虽然输入应该是非负,但防御性编程可以加上size <=0的判断)。 - 整数除法的取整逻辑:不同语言的整数除法规则有差异,比如有些语言会向下取整而非向零取整。如果是C语言,
sum / size是向零取整的,刚好匹配你的测试用例(比如第二个测试用例总和-10除以10得到-1,完全正确)。
验证测试用例
用修正后的代码跑你的测试用例:
- 5个元素
{1,4,3,3,4}:总和15,15/5=3 ✔️ - 10个元素
{-3,-10,0,0,0,0,1,2,0,0}:总和-10,-10/10=-1 ✔️ - 5个元素
{-1,2,3,-3,4}:总和5,5/5=1 ✔️ - 7个元素
{-6,-9,-7,-8,-8,-9,-9}:总和-56,-56/7=-8 ✔️
所有测试用例都能得到正确结果。
内容的提问来源于stack exchange,提问作者Yasir C
相关产品推荐
相关产品推荐

