谈一谈牛客网的编程体验

455 阅读1分钟

最近在找工作,总是接触到华为OD的岗位,也就想看看机试题都考些啥,让我崩溃的不是算法,而是牛客网的编程体验。

有一道题叫明明的随机数,先输入一个N,后面会输入N个数,对这些去重然后从小到大排序。

我用的是JavaScript Node, 会默认初始化出这样的代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        let tokens = line.split(' ');
        let a = parseInt(tokens[0]);
        let b = parseInt(tokens[1]);
        console.log(a + b);
    }
}()

我花了很多时间想着怎么把所有的输入都拿到,当然一部分原因是我没有仔细看输出,还有就是在HJ2 计算某字符出现次数中,我通过await readline()while拿到了第二个参数。

后来发现根本不行,这次是有多少入参就会进几次while循环。

看了题解后发现了这样的写法

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
const nums=[]
let clearNums=[]
rl.on('line', function (line) {
  nums.push(line);
    if(nums.length-1===Number(nums[0])){
        nums.shift();
        clearNums=Array.from(new Set(nums));
        clearNums.sort((a,b)=>{return a-b})
        clearNums.forEach(f=>{
            console.log(f)
        })
    }
});

好家伙,我得到入参还要搞这么一套复杂的操作,然后还要把数组里面的一个个打印出来才能算对。

这输入和输出跟算法有什么关系?这道题被定义为困难的原因主要是在这呗。

如果选择TypeScript,默认代码是会有rl.on('line',这不看已有答案真是触碰到知识盲区了,JavaScript V8 据说在某次改版中没有了。