如何以最快方式将整数字符串行转为整数数组?解决超时问题
优化整数文本转数组的速度方案
原代码的性能瓶颈主要来自两方面:一是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
相关产品推荐
相关产品推荐

