Java数组众数计算程序计数与识别结果异常,该如何排查解决?
问题定位
两个核心问题导致输出不符合预期:
- 计数输出错误:最终拼接结果时误用了临时计数变量
count1,count1存储的是遍历到最后一个元素时的出现次数,实际存储最大出现次数的变量是count2,这是计数不准的直接原因。 - 浮点相等判断风险:使用
==直接比较double类型的数值,遇到存在精度误差的浮点数时会出现相等判断错误,导致漏统计相同值。 - 统计逻辑冗余:已经对数组做过排序,相同元素连续排列,不需要嵌套两层循环做全量统计,存在不必要的性能开销。
修复方案
核心代码修复
直接替换原case7的众数计算逻辑即可,修复后代码如下:
case 7: { System.out.print("How many numbers do you want to find the mode of? "); double[] inputs = new double[scanner.nextInt()]; for(int i = 0; i < inputs.length; i++) { System.out.println("Input number " + i); inputs[i] = scanner.nextDouble(); } Arrays.sort(inputs); int maxCount = 0; int currentCount = 1; double mode = inputs[0]; // 单层遍历即可完成统计,效率更高 for(int i = 1; i < inputs.length; i++) { // 浮点相等判断增加精度阈值,避免精度误差导致判断错误 if(Math.abs(inputs[i] - inputs[i-1]) < 1e-9) { currentCount++; } else { currentCount = 1; } // 更新众数和最大计数 if(currentCount > maxCount) { maxCount = currentCount; mode = inputs[i]; } else if(currentCount == maxCount) { mode = Math.min(mode, inputs[i]); } } // 处理数组长度为1的边界场景 if(inputs.length == 1) { maxCount = 1; mode = inputs[0]; } finalans = "The mode of those " + inputs.length + " numbers is " + mode + ", with a staggering " + maxCount + " appearances."; return finalans; }
其他次要问题修复
你代码中case4(除法功能)的提示文本有误,当前写的是All numbers are subtracted from the first number, in inputted order.,应将subtracted改为divided,符合除法功能的逻辑描述。
内容的提问来源于stack exchange,提问作者CiY3
相关产品推荐
相关产品推荐

