字节跳动前端社招一面面经

由于面试官在国外,遂采用的视频面试。
1.自我介绍;
2.职业规划;
3.为什么选择字节跳动;
4.最近的项目中有什么是你优化的地方。
5.编程题:
JS实现一个带并发限制的异步调度器Scheduler,保证同时运行的任务最多有两个。完善代码中Scheduler类,使得以下程序能正确输出。
class Scheduler {
  add(promiseCreator) { ... }
  // ...}const timeout = (time) => new Promise(resolve => {
  setTimeout(resolve, time)
})const scheduler = new Scheduler()const addTask = (time, order) => {
  scheduler.add(() => timeout(time))
    .then(() => console.log(order))
}

addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')// output: 2 3 1 4// 一开始,1、2两个任务进入队列// 500ms时,2完成,输出2,任务3进队// 800ms时,3完成,输出3,任务4进队// 1000ms时,1完成,输出1// 1200ms时,4完成,输出4
我的答案:
class Scheduler {
  constructor () {
    this.list = [];
    this.count = 0;
  }
  add(promiseCreator) {
    return new Promise(resolve => {
      // 加入任务队列
      this.list.push(() => {
        resolve(Promise.resolve(promiseCreator()).then(s => {
          // 当前任务结束后,执行下一个任务
          this.count--;
          this.start();
          return s
        }));
      });
      // 执行当前任务
      this.start();
    })
  }

  start () {
    // 最多两个同时进行的任务
    if (this.count < 2) {
      this.count++;
      this.list[0] && this.list[0]();
      this.list.shift();
    }
  }
}
const timeout = (time) => new Promise(resolve => {
  setTimeout(resolve, time)
})
const scheduler = new Scheduler();

const addTask = (time, order) => {
  scheduler.add(() => timeout(time)).then(() => console.log(time, 'time, order', order))
}


addTask(1000, '1');
addTask(500, '2');
addTask(300, '3');
addTask(400, '4');
// output: 2 3 1 4
// 一开始,1、2两个任务进入队列
// 500ms时,2完成,输出2,任务3进队
// 800ms时,3完成,输出3,任务4进队
// 1000ms时,1完成,输出1
// 1200ms时,4完成,输出4
很遗憾代码没有通过用例,不知道哪里出错了😭,能否有大神指点下,让我死明白。

#面经##社招##字节跳动##前端工程师#
全部评论
应该没错吧。。。。。 //promise版     add(promiseCreator){         let content = this;             return new Promise((resolve,reject)=>{                 if(content.limit > 0){                     content.limit--;                     resolve(promiseCreator());                 }else{                     content.arr.push([resolve,promiseCreator]);                 }             }).then(()=>{                 if(content.arr.length){                     let item = content.arr.shift();                     item[0](item[1]());                 }else{                     content.limit++;                 }                 return Promise.resolve();             })         } //await版     async add(promiseCreator) {          if(this.limit<=0){              await new Promise((resolve)=>{                     this.arr.push(resolve);             })         }         this.limit--;         await promiseCreator();         this.limit++;                  if(this.arr.length) this.arr.shift()();     }
2 回复
分享
发布于 2021-02-25 19:28
边收集边执行,在任务完成回调之前,最多只能有两个 class Scheduler {     constructor() {         this.taskArr = []         this.count = 0     }     add(promiseCreator) {         return new Promise((resolve, reject) => {             this.taskArr.push({promiseCreator, resolve})             this.run()         })     }     run() {         if(this.taskArr.length && this.count < 2) {             this.count ++             let {promiseCreator, resolve} =  this.taskArr.shift()             Promise.resolve(promiseCreator()).then(() => {                 resolve()                 this.count --                 this.run()             })         }     } } const timeout = (time) => new Promise(resolve => {   setTimeout(resolve, time) }) const scheduler = new Scheduler() const addTask = (time, order) => {   scheduler.add(() => timeout(time))     .then(() => console.log(order)) } addTask(1000, '1') addTask(500, &(11526)#39;2') addTask(300, &(11527)#39;3') addTask(400, &(11528)#39;4')
2 回复
分享
发布于 2021-02-27 15:56
联易融
校招火热招聘中
官网直投
题目里的入队出队有指定, 你的明显不符合啊
1 回复
分享
发布于 2021-07-16 14:39
测了一下,给的那个用例是能通过的。。
点赞 回复
分享
发布于 2021-02-25 10:18
class Scheduler {     constructor() {         this.count = 0         this.waitQueue = [];     }     add(promiseCreator) {         if (this.count < 2) {             this.count += 1;             return this.run(promiseCreator)         } else {             return new Promise(resolve => {                 this.waitQueue.push(() => promiseCreator().then(resolve));             })         }     }     run(promiseCreator) {         return promiseCreator().then(() => {             this.count -= 1;             if (this.waitQueue.length) {                 this.run(this.waitQueue.shift())             }         });     } }
点赞 回复
分享
发布于 2021-03-07 14:01
没错啊 但没必要return s 也没必要promise.resolve()
点赞 回复
分享
发布于 2021-04-07 17:01
class Scheduler {     constructor() {         this.queue = [];         this.curQue = 0;     }     add(promiseCreator) {         let resolve;         const promise = new Promise(res => {             resolve = res;         });         promise.resolve = resolve;         this.queue.push({ promiseCreator, promise });         this.doTask();         return promise;     }     doTask() {         if (this.queue.length == 0) return;         if (this.curQue < 2) {             this.curQue++;             const obj = this.queue.shift();             const { promiseCreator, promise } = obj;             promiseCreator().then(() => {                 promise.resolve();                 this.curQue--;                 this.doTask();             });         }     } } 感觉我这个比较好理解
点赞 回复
分享
发布于 2021-08-31 23:34
点赞 回复
分享
发布于 2022-01-04 23:07
字节写code用什么代码编辑器,什么平台
点赞 回复
分享
发布于 2022-01-14 20:08

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
11 88 评论
分享
牛客网
牛客企业服务