使用Node写算法题的姿势
2019-03-19
使用Node写算法题的姿势
获取输入数据
有些OJ需要算法题代码自带读取输入的功能,主要姿势是这样:
/*
** 输入1 2 3 4 5
** 输出[1,2,3,4,5]
*/
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line',(line)=>{
let data = line.split(" ").map((value)=>{
return Number.parseInt(value);
})
console.log(data);
rl.close();
})
因为Node的设计全是异步的,读取输入的代码可能比其他语言麻烦点。而且在多行输入的时候,因为每行输入都是触发line事件,需要自己设置行计数器。
每一个line读进来都是string,需要自己调用parse方法去解析。总的来说还是比Java的nextInt()
这类方法麻烦点。
有更方便的封装好的读取输入的方法,需要的话请翻到最下。
VSCODE调试的姿势
VSCode调试没什么太大问题,主要是自带的OUTPUT在调试模式下是只读的,就是说不能输入。解决的方法就是设置外部Terminal,下面是我的lauch.json设置:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${file}",
"console": "externalTerminal"
}
]
}
用Promise封装了一个方便的用于多行输入的函数
主要是用闭包和Promise编写了一个异步的函数,每次只需要调用一个函数,就像呼吸一样方便!
function readinput(wantedLines) {
const rl = require('readline').createInterface({
input: process.stdin,
output: process.stdout
})
return new Promise((resolve,reject)=>{
let inputNum=0;
let input=[];
rl.on('line',(line)=>{
input[inputNum++] = line;
if(inputNum===wantedLines){
rl.close();
resolve(input);
}
})
})
}
/*
使用实例,读入三行数据
> a
> b
> c
[ 'a', 'b', 'c' ]
*/
readinput(3).then(lines=>{
console.log(lines);
})