起因是作者本人在学习完JavaScript之后,为了熟悉该语言,打算使用JS刷题巩固基础。但是由于读入方式的问题,实际使用起来会发现非常难处理输入的数据,由于之前都是使用C++刷算法题的,因此自己封装了一个模版,也就30来行代码,就可以直接以C++的风格单个读入输入值,非常方便啊。
在牛客网刷题时选择语言JavaScript Node,在洛谷就选Nodejs吧,这两是一个东西。
jsconst readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
class Input {
constructor() {
this.arr = []
this.index = 0
}
getFirst() {
return this.index >= this.arr.length ? null : this.arr[this.index++]
}
read(count = 1) {
if(count <= 1) return count === 1 ? this.getFirst() : null
const res = this.arr.slice(this.index, this.index + count)
this.index += res.length
return res
}
write(newArr) {
for(let i=0;i<newArr.length;i++) this.arr.push(newArr[i])
}
}
const input = new Input()
const read = (cnt) => input.read(cnt)
rl.on('line', line => input.write(line.trim().split(/\s+/)))
rl.on('close', () => solve() )
function solve(){
// 在这里写解题代码,使用read读入单个输入。
}
这里提供另一个模版,理论上在数据大的情况下会更快一点。
jsconst fs = require('fs')
class Scanner {
constructor() {
this.buffer = fs.readFileSync(0)
this.offset = 0
}
next() {
while(this.offset < this.buffer.length && this.buffer[this.offset] <= 32) this.offset++
if(this.offset >= this.buffer.length) return null
let start = this.offset
while(this.offset < this.buffer.length && this.buffer[this.offset] > 32) this.offset++
return this.buffer.toString('utf-8', start, this.offset)
}
nextLine() {
while(this.offset < this.buffer.length && (this.buffer[this.offset] === 10 || this.buffer[this.offset] === 13)) this.offset++
if(this.offset >= this.buffer.length) return null
let start = this.offset
while(this.offset < this.buffer.length && this.buffer[this.offset] !== 10 && this.buffer[this.offset] !== 13) this.offset++
let res = this.buffer.toString('utf-8', start, this.offset++)
return res
}
}
const scanner = new Scanner()
const read = () => scanner.next()
const readLine = () => scanner.nextLine()
本文作者:hwy2580
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!