本文介绍如何使用JavaScript(Node.js)实现控制台标准输入输出

使用JavaScript刷算法题的关键在于如何实现在控制台的标准输入输出,本文尝试以算法题中常见的几种输入要求为例,介绍JavaScript版控制台标准输入输出的实现

一、基本模版

实现echo

const readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

let inputs = ''

rl.on('line',data => {
  inputs = data.trim() //输入
  console.log('你所输入的是:' + inputs)//输出
  process.exit(0)
})

运行结果:
hello world

二、处理单行输入

将上文中基本模版添加数据处理的部分即可

const readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

let inputs = ''
let result = null
rl.on('line',data => {
  inputs = data.trim() //获取输入
  result = handle(inputs)//处理数据
  console.log(result)//输出
  process.exit(0)
})

function handle(inputs){
  //Do something
}

示例:实现字符串反转

输入示例:
hello world!
输出示例:
!dlrow olleh

const readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

let inputs = ''
let result = null
rl.on('line',data => {
  inputs = data.trim()//获取输入
  result = handle(inputs)//数据处理
  console.log(result)//输出
  process.exit(0)
})

function handle(inputs){
  return inputs.split('').reverse().join('')
}  

运行结果:
reverse

处理确定行输入

确定行即题目中已明确给出测试用例的行数。
有了上文中处理单行输入的基础,直接上示例

示例:合并字符串

输入示例:
abcd
1234
输出示例:
a1b2c3d4

const readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

let lineNum = 2 //要输入两行
let inputs = [] //储存输入的数据
let result = null
rl.on('line', data => {
  inputs.push(data.trim().split(''))//每输入一行,都push到inputs数组中
  if(inputs.length == lineNum ){  //当输入的行数与题目中要求的行数相同时
    result = handle(inputs)//数据处理
    console.log(result)//输出结果
    process.exit(0)
  }
})

function handle(inputs) {
  let ret = []
  for(let i = 0; i<inputs.length;i++){
    ret.push(input[0][i])
    ret.push(input[1][i])
  }
  return ret.join()
}

运行结果:
a1b2c3d4

处理1+N行数据

这是算法题中最常见的输入格式
先输入数字N,后面跟着N行输入

示例: 输出各组的最大值

输入示例:
3
1 2 3
4 5 6
7 8 9
输出示例:
3
6
9

const readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

let N = 0 //将N的初始值设置为0
let inputs = []
let result = null
rl.on('line', data => {
  if(N == 0) //如果N为初始值
    N = Number(data.trim())//将输入的值赋给N
  else{//如果N已经为键盘上输入的值了
    inputs.push(data.trim().split(' '))//将之后的每行输入压入数组inputs
    if(N == inputs.length){//如果输入的行数和要求的行数N相等了
      handle(inputs)//进行数据处理
      process.exit(0)
    }
  }
})

function handle(inputs) {
  inputs.forEach(item => {
    console.log(Math.max(...item))
  })
}

运行结果:
369

处理多行输入

多行输入也是比较常见的输入要求
只需要在处理输入时标记一下当前行号即可

示例: 统计各组数据在标准数据中的个数

输入示例:
5
1 2 3 4 5
3
1 0 0 0 0
1 2 0 0 0
1 2 3 0 0
输出示例:
1
2
3

输入示例说明:
第一行 5 表示标准数组中有5个元素
第二行 1 2 3 4 5 即为标准数组内的各个元素
第三行 3 表示接下来有3组测试用例,判断这三组测试用例中的与标准数组中的元素相同的个数
第4-6行 即为三组测试用例

const readline = require('readline')
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

let lineNum = 0  //表示当前正在输入的行号,初始化值为0,即还未输入

let elementNum = 0 
let stdArr = []

let testNum = 0
let testArr = []

let result = null
rl.on('line', data => {
  lineNum++ //键盘每输入一行,当前输入行号+1
  if (lineNum == 1) //如果当前输入的是第一行
    elementNum = Number(data.trim())
  else if (lineNum == 2)//如果当前输入的是第二行
    stdArr = data.trim().split(' ')
  else if (lineNum == 3)//如果当前输入的是第三行
    testNum = Number(data.trim()) //testNum 表示之后测试用例的个数
  else {//如果当前输入的是第四行及以后
    testNum --  //每输入一行,测试用例的个数-1
    testArr = data.trim().split(' ')
    console.log(handle(testArr)) //处理该组测试用例,输出
    if (testNum == 0) {
      process.exit(0)
    }
  }
})
function handle(testArr) {
  let count = 0
  testArr.forEach(item => {
    if (stdArr.includes(item)){
      count++
    }
  })
  return count
}

运行结果:
123

总结

上面总结几种方法,可以当作解题模板,直接套就可以了。
过程其实很简单,输入 => 处理数据 => 输出
如果处理数据部分较为简单,就不用单独封装出函数来处理了
另外,oj 系统一般都支持输入一组测试用例接着输出一组结果,不必等所有测试用例都处理完了再将所有结果一起输出

希望上述方法对你有所帮助

参考: https://www.cnblogs.com/floor/p/6667059.html