前端面试的ACM模式笔试输入模式

在前端面试的ACM模式笔试中,输入参数的读取是核心技能之一,以下是常见场景的代码实现及注意事项:


一、JavaScript的两种输入模式

1. V8模式(浏览器环境/部分OJ平台)

核心方法:通过 read_line()readline() 逐行读取输入,字符串需手动解析。
代码示例

// 读取单行多个数字(如输入:"3 5 7")
let line = read_line();
let nums = line.split(' ').map(Number); // 转为数字数组 [3, 5, 7]

// 读取多行不定数量输入(如多组测试用例)
while ((line = read_line()) !== '') {
    
    
  let [a, b] = line.split(' ').map(Number);
  console.log(a + b);
}

适用场景:牛客网等平台。

2. Node.js模式

核心方法:使用 readline 模块逐行监听输入流。
代码示例

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

let lines = [];
rl.on('line', (line) => {
    
    
  lines.push(line);
  // 示例:读取两行后处理(第一行为n,第二行为n个数字)
  if (lines.length === 2) {
    
    
    const n = parseInt(lines[0]);
    const nums = lines[1].split(' ').map(Number);
    console.log(nums.reduce((a, b) => a + b, 0));
    rl.close();
  }
});

适用场景:赛码等需要手动处理输入结束的平台。


二、常见输入场景及处理

1. 单行固定参数

输入格式:例如 "5 10",表示两个整数。
处理代码

const [a, b] = read_line().split(' ').map(Number);
2. 多行动态输入

输入格式:第一行为组数 t,后续每行一组数据。

3
1 2
3 4
5 6

处理代码

const t = parseInt(read_line());
for (let i = 0; i < t; i++) {
    
    
  const [a, b] = read_line().split(' ').map(Number);
  console.log(a + b);
}
3. 不定行输入(以特定条件结束)

输入格式:多行数据,以 0 0 结束。

2 3
4 5
0 0

处理代码

while (true) {
    
    
  const line = read_line();
  const [a, b] = line.split(' ').map(Number);
  if (a === 0 && b === 0) break;
  console.log(a + b);
}
4. 复杂结构输入(如矩阵)

输入格式:第一行为矩阵维度 n m,后续 n 行每行 m 个数字。

2 3
1 2 3
4 5 6

处理代码

const [n, m] = read_line().split(' ').map(Number);
const matrix = [];
for (let i = 0; i < n; i++) {
    
    
  matrix.push(read_line().split(' ').map(Number));
}

三、注意事项

  1. 类型转换:输入默认为字符串,需用 map(Number)parseInt 转为数字。
  2. 平台差异:部分平台(如牛客)输入结束不会触发额外事件,需提前判断终止条件。
  3. 性能优化:大量数据时避免频繁 console.log,可缓存结果后统一输出。
  4. 错误处理:对输入格式做校验(如 if (nums.length !== n) throw error)。

通过掌握这些模式,可以高效应对前端笔试中的输入处理难题。更多实战题目可参考专业刷题平台(如 bishipass.com)。