Java实现plusMinus算法时arr.size()打印次数等于数组长度问题排查
问题修复方案
核心问题原因
- 打印语句、占比计算代码全部写在
for循环体内,循环执行次数等于数组长度,所以arr.size()的打印次数和数组size完全一致。 - 循环内错误判断循环变量
i的值,而非数组对应位置的元素值,会导致正负零的计数完全不符合预期。 - Java中int类型直接做除法会触发整数截断,计算占比时会得到错误的0值,无法得到正确小数结果。
- 未做小数位数格式化,无法满足保留6位小数的输出要求。
修复后代码(仅修改Result类,Solution类保持不变)
class Result { public static void plusMinus(List<Integer> arr) { int plus = 0; int minus = 0; int zero = 0; int arrSize = arr.size(); // 循环仅做元素计数 for (int i = 0; i < arrSize; ++i) { int currentNum = arr.get(i); if (currentNum == 0) { zero++; } else if (currentNum < 0) { minus++; } else { plus++; } } // 循环外计算占比,强转为double避免整数除法 double plusPortion = (double) plus / arrSize; double minusPortion = (double) minus / arrSize; double zeroPortion = (double) zero / arrSize; // 格式化输出,保留6位小数 System.out.printf("%.6f%n", plusPortion); System.out.printf("%.6f%n", minusPortion); System.out.printf("%.6f%n", zeroPortion); } } public class Solution { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(bufferedReader.readLine().trim()); List<Integer> arr = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" ")) .map(Integer::parseInt) .collect(toList()); Result.plusMinus(arr); bufferedReader.close(); } }
修改点说明
- 将占比计算、打印逻辑全部移到
for循环外部,避免重复执行 - 循环内改为获取数组对应下标的元素
arr.get(i)做判断,修正计数逻辑 - 计算占比时先将计数值强转为
double类型,避免整数除法截断结果 - 使用
printf格式化输出,直接指定保留6位小数,符合输出要求
内容的提问来源于stack exchange,提问作者potstickerNut
相关产品推荐
相关产品推荐

