前端笔试之JavaScript ACM模式
前言
相信很多小伙伴刷算法题,都是用力扣。但是,力扣是核心代码模式,是不需要处理输入、输出的,只需要直接返回值就行。笔试、面试的时候,不一定是核心代码模式,也可能是ACM模式。如果没有了解过JavaScript的输入输出可能就寄了。(本人就试过突然ACM模式笔试,后面不知道怎么输入输出,直接重操旧业,用C++来做题😂)
祝看到这篇文章并且在找工作的,顺顺利利拿到心仪的offer
。(包括本人🐶)
JavaScript的ACM模式会有两种:V8模式
、Nodejs模式
。
V8模式
输出
console.log();
这个就没啥好说的了,学JavaScript还不认识这个的话,就太尴尬了。
读取一行输入(read_line()
)
最多读取个字符,当还未达到1024个时如果遇到回车或结束符,提前结束。也有可能是readline()
。牛客ACM模式就是readline()
。
$\color{red}最重要的一个输入方法$,可以通过该方法得到所有情况的输入,后面讲的其他输入方法,有可能没有。比如牛客的ACM模式,使用后面的输入,都会报错:xxx is not defined
read_line()
返回输入的一行,字符串形式。需要通过split
、parseInt
等方法来得到真正的输入。(这里确实比C++那些要麻烦得多)
练习
题目来源:OJ在线编程常见输入输出练习场J
$\color{red}题目来源是牛客,但是练习是在赛码上练的,因为牛客提供的输入API少很多。$
1. A+B(1)
1 2 3 4 5 6 7 8 9
| let line; while(line = read_line()) { let nums = line.split(' ');
let a = +nums[0]; let b = +nums[1];
console.log(a + b); }
|
2. A+B(2)
1 2 3 4 5 6 7 8 9 10 11
| let t;
while(t = +read_line()) { while(t--) { let line = read_line();
let [a, b] = line.split(' ').map(Number);
console.log(a + b); } }
|
3. A+B(4)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| let line; while(line = read_line()) { let [n, ...nums] = line.split(' ').map(Number);
if(n === 0) { break; }
let sum = 0;
for(let i = 0; i < n; i++) { sum += nums[i]; }
console.log(sum); }
|
4. A+B(5)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| let t;
while(t = +read_line()) { console.log() while(t--) { let [n, ...nums] = read_line().split(' ').map(Number)
let sum = 0; for(let i = 0; i < n; i++) { sum += nums[i]; }
console.log(sum); } }
|
读取一个整数(readInt()
)
根据平台的不同,有可能不提供该接口,比如牛客网。
练习
A+B(1)
1 2 3 4 5 6
| let a; let b;
while((a = readInt()) && (b = readInt())) { console.log(a + b); }
|
正所谓,术业有专攻,很明显,有的时候直接用readInt()
会比read_line()
方便很多。(当然前提是你做题的平台有提供这个接口才行)
读取一个浮点型(readDouble
)
和readInt()
基本一致。
1 2 3 4 5 6
| let a; let b;
while((a = readDouble()) && (b = readDouble())) { console.log(a + b); }
|
最多读取n个字符,当没有达到n个时,如果遇到回车或结束符,会提前结束。
读取n个字符(gets(n)
)
因为read_line()
只能读取1024个字符,所以如果输入长度大于1024个字符的字符串的话,就轮到gets(n)
函数大显神通了。
1 2 3 4 5 6
| let n;
while(n = +read_line()) { let str = gets(n); console.log(str + ' - clz'); }
|
如果题目备注字符串的长度范围为1到10000。
那么读取输入应该是gets(10000)
Nodejs模式
Nodejs输入主要有三大步骤:
引入readline
模块
调用readline.createInterface()
,创建一个readline的接口实例
监听line
事件,事件处理函数的参数就是输入的行
1 2 3 4 5 6 7 8 9
| const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', function (line) { });
|
练习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', function (line) { let nums = line.split(' ');
if(nums && nums.length == 2) {
let a = +nums[0]; let b = +nums[1];
console.log(a + b); } });
|
小贴士
输出指定位数使用toFixed(n)
函数(四舍五入)
1 2 3
| let a = 1 / 6;
console.log(a.toFixed(3));
|
参考
ACMcoder OJ