赛码网牛客在acm模式下利用node.js处理多行输入方法
赛码网在JS Node
的语言下,acm
模式的默认标准输入输出代码是这样的:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', function (line) {
const tokens = line.split(' ');
console.log(parseInt(tokens[0]) + parseInt(tokens[1]));
});
输入:1 1
返回值:2
单行还好,如果是碰到多行就要转化一下
多行输入
var readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 初始化一个数组来存储输入的每一行数据
let lines = [];
function changeNum(arr) {
return arr.map(item => {
// 检查当前项是否为数组,如果是,则递归调用该函数
if (Array.isArray(item)) {
return changeNum(item);
} else {
// 将字符串转换为数字
return Number(item);
}
});
}
rl.on('line', function (line) {
// 去除每行首尾的空格,然后按空格分割每一行
lines.push(line.trim().split(' '));
if(lines.length===5){
//有几行写多少,5只是针对5行输入
lines=changeNum(lines)
//书写自己代码的逻辑
console.log(lines);
}});
代码解释:
这段代码使用了Node.js的readline
模块来从标准输入读取数据。下面是对代码的逐行分析:
-
var readline = require('readline');
- 这行代码引入了Node.js的readline
模块,该模块允许程序从标准输入读取数据。 -
const rl = readline.createInterface({ ... });
- 这行代码创建了一个readline.Interface
对象,它配置了readline
模块以从标准输入(process.stdin
)读取数据,并将输出发送到标准输出(process.stdout
)。 -
let lines = [];
- 声明一个变量lines
,用来存储从标准输入读取的每一行数据。 -
function changeNum(arr) { ... }
- 定义了一个名为changeNum
的函数,它接受一个数组arr
作为参数。这个函数的目的是将数组中的所有字符串元素转换为数字。 -
return arr.map(item => { ... });
- 使用map
函数遍历数组arr
中的每个元素。对于每个元素,执行以下操作:-
if (Array.isArray(item)) { ... }
- 如果元素item
是一个数组,递归调用changeNum
函数以处理嵌套数组。 -
return Number(item);
- 如果元素item
不是数组,使用Number
函数将其转换为数字。
-
-
rl.on('line', function (line) { ... });
- 为readline
接口添加一个事件监听器,当接收到一行输入时触发。这个事件监听器做了以下事情:-
lines.push(line.trim().split(' '));
- 读取一行输入,去除首尾的空格,然后使用空格作为分隔符将其分割成数组,并添加到lines
数组中。 -
if(lines.length===5){ ... }
- 当lines
数组的长度达到5时,执行以下操作:-
lines=changeNum(lines);
- 调用changeNum
函数,将lines
数组中的所有字符串元素转换为数字。 -
console.log(lines);
- 打印转换后的lines
数组。
-
-
这段代码的主要目的是从标准输入读取数据,每读取5行数据后,将这些数据中的字符串转换为数字,并打印转换后的数组。这可能是为了处理某种格式的输入数据,例如,每5行数据表示一个记录,需要将这些记录中的数字字符串转换为实际的数字类型。
输入:
1
2 3
3
4 5
5
输出:[ [ 1 ], [ 2, 3 ], [ 3 ], [ 4, 5 ], [ 5 ] ]
之后就按数组每一项计算
注意:
如果不使用changeNum
转化,得到的数据是
[ [ '1' ], [ '2', '3' ], [ '3' ], [ '4', '5' ], [ '5' ] ]