Java算法题输入处理:常见场景与代码实现
在Java算法编程中,高效且准确地读取数据是解题的基础。本文总结了四种典型输入场景的处理方案:从固定数量循环到自定义结束符,再到多组未知行数的流式读取。通过对比Scanner与BufferedReader的特性,特别是区分next()和nextLine()的行为,帮助你在面对不同数据格式时选择最优解。
基于确定范围的固定输入
当题目明确告知数据规模(如N个元素)时,这是最简单的场景。利用Scanner配合for循环即可稳定读取,无需额外判断逻辑。
Scanner scanner = new Scanner(System.in);
// 假设首先输入一个整数n,表示接下来要输入的数据量
if (scanner.hasNextInt()) {
int n = scanner.nextInt();
int[] arrays = new int[n];
for (int i = 0; i < n; i++) {
if (scanner.hasNextInt()) {
arrays[i] = scanner.nextInt();
}
}
}
指定结束符的循环读取
若未给定总数,而是以特定字符(如"0"或"#")作为终止信号,可使用while循环结合条件判断。注意字符串比较应使用equals()而非==,以避免内存地址比对错误。
Scanner scanner = new Scanner(System.in);
String endFlag = "0";
// 方法一:使用hasNext进行预判
while (!scanner.hasNext(endFlag)) {
String input = scanner.nextLine();
// 处理input逻辑...
}
// 方法二:直接读取并比较
while (true) {
String line = scanner.nextLine();
if (line.equals(endFlag)) {
break;
}
// 处理line逻辑...
}
未知行数的多组数据流式读取
在处理大量输入或多组测试用例时,Scanner可能因内部正则表达式匹配导致性能瓶颈甚至超时。此时推荐改用BufferedReader,它提供底层缓冲,效率更高。
通过判断读入行是否为null来识别EOF(文件结束),这是标准的无行数限制读取模式:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
// readLine()返回null表示没有更多数据
while ((str = br.readLine()) != null && !str.isEmpty()) {
// 处理单行数据
System.out.println("Read: " + str);
}
}
}
第1步:初始化缓冲输入流
入口为System.in,动作是将字节流转为字符流并添加缓冲层,参数为默认缓冲区大小。
第2步:执行非阻塞读取循环
入口为BufferedReader实例,动作为调用readLine(),重要参数为空指针检查,完成状态是遇到空行或文件尾退出。
next() 与 nextLine() 的核心区别
这两个方法在处理带空格文本时的行为差异是导致许多“Wrong Answer”的原因:
next():忽略前导空白,读取直到遇见下一个分隔符(空格、Tab、换行等)。返回值不包含尾部空格。nextLine():从头读到行尾,自动消费末尾的换行符。返回值包含中间的所有空格。
Scanner scanner = new Scanner(System.in); // 假设标准输入内容为: hello world\n String str1 = scanner.next(); // 读取 "hello" String str2 = scanner.nextLine(); // 继续读取剩余部分 " world" (含前导空格) System.out.println(str1); // 输出: hello System.out.println(str2); // 输出: world
建议:若需整行读取且包含空格,始终优先使用nextLine()。
多行数字列表处理示例
对于需要收集多行输入并在之后统一处理的场景,可以使用List暂存数据。以下代码演示了如何读取直到用户输入"q"为止的多行内容:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
List dataList = new ArrayList<>();
String input;
while (true) {
System.out.print("请输入一行 (输入'q'退出): ");
if (sc.hasNextLine()) {
input = sc.nextLine();
if ("q".equals(input)) {
break;
}
dataList.add(input);
}
}
// 遍历打印存入的数据
for (String s : dataList) {
System.out.println(s);
}
注意:如果一行中包含多个用空格分隔的数字,需先对获取到的字符串进行split("\\s+")分割,再分别解析为数值类型。
总结
以上就是Java算法题中输入问题的详细处理方法,包括如何处理固定长度、指定结束符以及高吞吐量的流式输入。掌握Scanner的细节差异与BufferedReader的高效替代方案,能有效提升解题成功率。更多关于Java IO操作与算法输入优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













