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

如何以最快方式将整数字符串行转为整数数组?解决超时问题

优化整数文本转数组的速度方案

原代码的性能瓶颈主要来自两方面:一是split("\s+")依赖正则表达式分割字符串,正则匹配的开销较高;二是Stream API的链式操作带来了额外的对象包装和方法调用开销。针对这两个问题,以下是几种高效的优化方案:

方案一:手动字符解析(性能最优)

直接遍历字符串的每个字符,手动提取整数,完全避免正则和Stream的开销,是处理大量数据时最快的方式:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
int[] a = new int[10000];
int index = 0;
int currentNum = 0;
boolean isNegative = false;

for (char c : line.toCharArray()) {
    if (c == '-') {
        isNegative = true;
    } else if (Character.isDigit(c)) {
        currentNum = currentNum * 10 + (c - '0');
    } else if (c == ' ') {
        // 遇到空格,保存当前数字
        a[index++] = isNegative ? -currentNum : currentNum;
        currentNum = 0;
        isNegative = false;
    }
}
// 处理最后一个数字
a[index] = isNegative ? -currentNum : currentNum;

方案二:使用StringTokenizer替代split

StringTokenizer是专门的字符串分割工具,不依赖正则表达式,比split("\s+")的性能更高,搭配手动数组填充代替Stream:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tokenizer = new StringTokenizer(br.readLine());
int[] a = new int[10000];
int i = 0;

while (tokenizer.hasMoreTokens()) {
    a[i++] = Integer.parseInt(tokenizer.nextToken());
}

方案三:优化输入流缓冲区

增大BufferedReader的缓冲区大小,减少IO读取的次数,提升数据读取速度(默认缓冲区为8192字节,可根据数据量调整):

// 设置16KB缓冲区,比默认更大,适合大文本行读取
BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 16384);
// 后续可搭配方案一或方案二的解析逻辑

额外提示

如果输入的整数格式固定(比如每个整数之间只有单个空格),可以进一步简化手动解析的逻辑,省略对多空格的判断,进一步提升速度。

内容的提问来源于stack exchange,提问作者Minh Anh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:57:26