如何修复JavaScript函数以正确识别偶数数组中的奇数?
问题分析与修复:findOutlier函数返回错误值的原因
问题根源
测试数组[0, 1, 2]时,函数返回0而非预期的1,核心原因是阈值设置不符合“多数”的实际语义:
- 数组中偶数有
0和2,共2个,总长度3,偶数占比约66.67%,低于设定的80%阈值,因此isMostlyEven返回false。 findOutlier进入“查找偶数”的分支,第一个元素0是偶数,直接被返回,而非目标奇数1。- 80%的阈值对于短数组(如长度3)过于严苛,需要至少3个元素全是偶数才会判定为“以偶数为主”,这显然不符合“找少数异常值”的需求。
修复方案
方案1:调整阈值为50%(多数的标准定义)
将findOutlier中调用isMostlyEven的阈值从80改为50,只要某类数占比超过一半,就判定为“为主”的类别。同时优化代码细节(直接用数组长度替代循环计数,返回原数而非绝对值):
function isMostlyEven(array, thresholdPercentage) { let evenCount = 0; const totalCount = array.length; // 直接取数组长度,无需循环计数 for (let num of array) { if (num % 2 === 0) { evenCount++; } } const evenPercentage = (evenCount / totalCount) * 100; return evenPercentage >= thresholdPercentage; } function findOutlier(integers){ // 调整阈值为50%,符合“多数”的常规定义 if (isMostlyEven(integers, 50)) { // 在偶数为主的数组中找奇数 for (let num of integers) { if (Math.abs(num) % 2 === 1) { return num; // 返回原数,保留正负号 } } } else { // 在奇数为主的数组中找偶数 for (let num of integers) { if (Math.abs(num) % 2 === 0) { return num; } } } } const intArr = [0, 1, 2]; console.log(findOutlier(intArr)); // 输出1
方案2:直接判断“多数”,避免百分比精度问题
如果不需要动态阈值,可以简化isMostlyEven的逻辑,直接判断偶数数量是否超过总数的一半,这样更高效且避免百分比计算的精度问题:
function isMostlyEven(array) { let evenCount = 0; const totalCount = array.length; for (let num of array) { if (num % 2 === 0) { evenCount++; } } // 偶数数量超过总数一半,判定为以偶数为主 return evenCount > totalCount / 2; } function findOutlier(integers){ if (isMostlyEven(integers)) { for (let num of integers) { if (Math.abs(num) % 2 === 1) { return num; } } } else { for (let num of integers) { if (Math.abs(num) % 2 === 0) { return num; } } } } const intArr = [0, 1, 2]; console.log(findOutlier(intArr)); // 输出1
内容的提问来源于stack exchange,提问作者Jefferson Chukwu
相关产品推荐
相关产品推荐

