HackerEarth一维数组练习:BufferedReader读取时min值异常
问题排查:一维数组最小值计算异常
问题描述
在HackerEarth平台完成一维数组极值算法练习时,使用BufferedReader读取输入后,计算最小值的min变量始终保留Integer.MAX_VALUE的初始值,无法正确更新为数组中的最小值。代码及运行输出如下:
原代码
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; class TestClass { public static void main(String args[] ) throws Exception { //BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); int N = Integer.parseInt(br.readLine()); while (T-- >= 0) { String[] line = br.readLine().trim().split("\s"); int min = Integer.MAX_VALUE; for (int i = 0; i < line.length - 1; i++) { min = Math.min(min, Integer.parseInt(line[i])); } System.out.println(min); } } }
运行输出
1 2147483647 2
错误原因分析
数组遍历范围错误:
核心问题出在for循环条件i < line.length - 1,这会直接跳过数组的最后一个元素。如果输入的数组只有1个元素,循环完全不会执行,min自然保持初始值Integer.MAX_VALUE;即使数组元素更多,也会漏掉最后一个元素的比较逻辑。测试用例循环次数错误:
while (T-- >= 0)的条件会导致循环多执行一次。比如当T=1时,第一次循环T从1变为0(满足条件),第二次循环T从0变为-1(仍满足条件),这会触发额外一次读取操作,可能读取到无效输入,甚至抛出异常。输入读取逻辑不符合常规题面要求:
通常HackerEarth的此类题目输入格式为:先读测试用例数T,然后每个测试用例依次读取数组长度N和数组元素。但原代码仅在开头读取一次N,后续循环未处理每个测试用例的N,可能导致输入读取错位。
修正后的代码
import java.io.BufferedReader; import java.io.InputStreamReader; class TestClass { public static void main(String args[] ) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); // 循环T次处理每个测试用例 for (int t = 0; t < T; t++) { // 读取当前测试用例的数组长度(若题目要求则保留) int N = Integer.parseInt(br.readLine()); String[] line = br.readLine().trim().split("\\s+"); int min = Integer.MAX_VALUE; // 遍历数组所有元素 for (int i = 0; i < line.length; i++) { int num = Integer.parseInt(line[i]); min = Math.min(min, num); } System.out.println(min); } } }
额外说明
- 拆分字符串时使用
"\\s+"替代"\s",可以匹配多个连续空格,避免因输入空格数量导致的数组元素空值问题。 - 如果题目输入格式是每个测试用例直接一行数组(无需单独读N),可以去掉循环内的
int N = Integer.parseInt(br.readLine());这一行。
内容的提问来源于stack exchange,提问作者IlCorsaroNero
相关产品推荐
相关产品推荐

