牛客网使用JS刷题如何处理输入输出

2017-03-14  本文已影响7109人  大水啊大水

某牛官方帮助文档镇楼

其中已经给出了js的样例,以简单的A+B题目为例

var readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})
rl.on('line', function(line) {
  var tokens = line.split(' ')
  console.log(parseInt(tokens[0]) + parseInt(tokens[1]));
})

尝试使用node本地运行,我们可以发现,每输入一行回车后即会输出结果,然后可以继续输入

执行结果

我们来解读一下怎么处理的输入输出

//每读一行,即一行输入结束敲回车,执行事件line对应的方法(这里为计算A+B并输出)
rl.on('line', function(line) {
  var tokens = line.split(' ')
  //直接使用console.log进行输出,一次输出即为一行,输出多行可多次使用console.log
  console.log(parseInt(tokens[0]) + parseInt(tokens[1]));
})

关于读多行的问题,理清以后就可以自行解决了,如下方法(看上去好像不太优雅)

// 获取三行输入的值,输出它们的和
var countLine = 1
var tokens = []
rl.on('line', function(line) {
  tokens.push(line)
  if(countLine === 3) {
    //求和
    console.log(
      tokens.reduce(function(sum, item) {
        return sum + parseInt(item)
      }, 0)
    );
    countLine = 1
    tokens = []
  } else {
    countLine++
  }
})

但是如果题目中并没有给出具体的输入行数,上面的方法就不可取了,我们需要一次性读取所有的输入然后再处理输出,操作如下

process.stdin.resume();
process.stdin.setEncoding('ascii');

var input = "";
var input_array = "";

process.stdin.on('data', function (data) {
    input += data;
});

process.stdin.on('end', function () {
    input_array = input.split("\n");
    // 处理input
});

我个人比较喜欢使用第一种方法,在本地终端使用也很方便,第二种方法的话,如果在终端中使用,需要将end事件修改成

process.on('SIGINT', function() {
  // 你的处理
  process.exit(0);
})

这样的话,使用ctrl+c就可以得到输出

吐槽某马和某鹅

习惯了牛客的node输入输出以后其它的都不适应了……

赛马网node官方给出的是上面说到的第二种处理方式,第一种应该也行但我没有试过。注意:赛马将js和node分为两种不同的输入输出,个人很不适应所谓的js输入输出,虽然看上去好像很简单,但是本地不好测啊……输出好像还是用定制的print函数来着……对了,练习的时候还有node选项,等到正式笔试就只有js选项了,神坑……附:赛码网在线编程系统使用指南

腾讯则根本没有node选项,只有定制的js输入,使用固定的main函数接受输入,我至今还不太理解……输出还是用console log

上一篇下一篇

猜你喜欢

热点阅读