You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因分析

  1. 数组遍历范围错误:
    核心问题出在for循环条件i < line.length - 1,这会直接跳过数组的最后一个元素。如果输入的数组只有1个元素,循环完全不会执行,min自然保持初始值Integer.MAX_VALUE;即使数组元素更多,也会漏掉最后一个元素的比较逻辑。

  2. 测试用例循环次数错误:
    while (T-- >= 0)的条件会导致循环多执行一次。比如当T=1时,第一次循环T从1变为0(满足条件),第二次循环T从0变为-1(仍满足条件),这会触发额外一次读取操作,可能读取到无效输入,甚至抛出异常。

  3. 输入读取逻辑不符合常规题面要求:
    通常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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:25:23