输入信息时如何检测空行:Java实现OJ 11057 Exact Sum多组输入
问题修复方案
核心问题原因
- 输入终止逻辑错误:
Scanner.nextLine()永远不会返回null,输入流耗尽时会直接抛出NoSuchElementException,且你连续调用了两次sc.nextLine(),会额外吞掉一行输入,导致第二组数据读取错位。 - 测试用例数据未重置:
bookPrices是类全局变量,每跑完一组测试用例未清空,下一组数据会累加旧数据导致计算错误。 - 判题平台输入规则不符:OJ的多组输入一般不会用空行分隔,而是直到输入流结束为止,靠空行判断终止不符合题目的输入约定。
修复后的代码
直接替换原有readEntry方法即可解决多组输入问题:
public void readEntry() { StringBuilder answer = new StringBuilder(); // 用hasNextInt判断是否还有下一组输入,符合OJ通用输入规则 while (sc.hasNextInt()) { // 每轮开始前清空上一轮的书价数据,避免数据污染 bookPrices.clear(); n = sc.nextInt(); for (int i = 0; i < n; i++) { bookPrices.add(sc.nextInt()); } Collections.sort(bookPrices); m = sc.nextInt(); answer.append(printMsg()).append("\n"); } System.out.println(answer); }
注:原有代码中所有多余的sc.nextLine()都可以删除,nextInt()会自动跳过空格、换行符等空白分隔符,不需要手动处理换行。
额外优化建议
- 现有判断重复的逻辑可以简化,不需要遍历全列表调用
Collections.frequency,排序后检查相邻元素是否相等即可判定存在重复,性能更高。 - 可以用双指针法替代现有二分查找逻辑,时间复杂度更低,不过现有逻辑不影响正确性可以不用调整。
内容的提问来源于stack exchange,提问作者JokerFever
相关产品推荐
相关产品推荐

