CVTE3.24前端二面

直入主题,问我项目做了啥
目前做的毕业设计有啥难点,扯了小程序相关的
然后就开始手撕了,这个手撕搞了几十分钟,写对了,但是因为实例代码有点问题,结果总是不对,并且因为我写的答案面试官说没见过有人这么写,然后他在那看我这个到底为什么总能运行对:

/**
* 请实现一个队列处理程序,当传入任务队列时,能够串行地处理完任务,
* 如果传入的任务包含异步执行,那么必须确保异步执行完毕之后才会执行后面的任务。
**/

function queue(list){

}

function task1(next){
  setTimeout(function(){
    console.log(1);
    next();
  }, 1000)
}

function task2(next){
  console.log(2)
  next();
}

function task3(next){
  setTimeout(function(){
    console.log(3);
    next();
  }, 200)
}

queue([task1, task2, task3])
// queue([task1, task2, task3]); // 下面多了一行这个,导致打印结果一直不对
// 按顺序输出 1, 2, 3

标准答案应该是用递归的:

function queue(list){
  let i = 0;

  function next() {
    if(i < list.length) {
        list[i](next);
        i ++;
    }
  }
  next();
}

但因为我最近看了promise的串行执行,我就用起了promise:

function queue(list){
  list.reduce((p, f) => {
      return p.then(() => {
          return new Promise(next => {
              f(next);
          })
      })
  }, Promise.resolve());
}

然后因为实例代码多了一行queue([task1, task2, task3]);,搞得打印结果总是会奇奇怪怪,后来面试官让我用递归,然后我写出了参考答案的那种,打印结果还是奇奇怪怪,后来两个人就在那看为什么,结果发现最底下居然多了点东西,删掉之后两个都对了

面试官觉得我写的那个可能会有漏洞,就让我调调每个任务的延迟时间,但是每次都没有问题,然后就出这道题的变体给我,让我接着用我的写法完成:

// 加多一个参数 count ,表示任务最大并行数
function queue(list, count){

}
queue([task1, task2, task3], count);

然后参考的答案是这种的:

function queue(list){
  let i = 0;

  function next() {
    if(i < list.length) {
        list[i](next);
        i ++;
    }
  }

  for(let j = 0; j < count; j ++) {
      next();
  }
}

我的是这种的:

function queue(list, count){
    let i = 0;
    // 相当于开启 count 个执行线路,那么就可以用 reduce 创建 count 条 promise 执行链
    const path = [];
    for(let j = 0; j < count; j ++) {
        path[j] = 
            list.reduce((p, f) => {
                return p.then(() => {
                    if(i >= list.length) return;
                    return new Promise(next => {
                        list[i ++](next);
                    })
                })
            }, Promise.resolve());
    }
    Promise.all(path);
}

结果也是执行对的,然后由于时间关系,面试官就没有给我看第三种变体了,就下一题了

如果班上50个人,至少两个人同一天生日的可能性是多少(刚开始想着用全排列算概率,然后其实想考察的是大数定律)

然后面试官说要问的问题就这么多了,我没有什么问题想反问,就结束了

#cvte##广州视源电子科技股份有限公司##面经#
全部评论
两道算法题 我遇到直接死了
点赞 回复
分享
发布于 2022-03-24 22:03

相关推荐

点赞 13 评论
分享
牛客网
牛客企业服务