使用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);
})