字节跳动前端一面

1面大概面了1个小时6分钟。主要是我话多。。。
主要面的是前端基础和算法

  1. 首先自我介绍
  2. 谈谈let、const和var,详细博文在这:let、const和var
  3. 说说基本类型和引用类型
  4. 考察了一道异步和事件循环看代码回答题
  5. 两道算法题

1、2和3本文就不说了。
第4个题目大概是这样的,问以下代码控制台输出什么?

setTimeout(console.log, 0, 0);
console.log(1);
new Promise((resolve, reject) => {
  console.log(2);
  for (let i = 0; i < 10000; i++) {
    if (i === 9999) {
      resolve();
    }
  }
  console.log(4);
}).then(() => {
  console.log(5);
});
console.log(6);

答案是:1 2 4 6 5 0,这个我答对了,你答对了吗?
但是下面这个我没对。。。。

setTimeout(console.log, 0, 0);
console.log(1);
new Promise((resolve, reject) => {
  console.log(2);
  //for (let i = 0; i < 10000; i++) {
    // if (i === 9999) {
    //   resolve();
    // }
  //}
  console.log(4);
}).then(() => {
  console.log(5);
});

console.log(6);

问这个打印输出会有变化吗? 正确答案是1 2 4 6 0。
这个相关知识可以看【前端基础】简单易懂的Promise这篇博文。

最后就是做两道算法题:这两个算法题我也做出来了。
第一道算法题:
原地以.反转字符串,时间复杂度要求为O(1)即要求只遍历一遍 www.toutiao.com操作该字符串变为com.toutiao.www。
算法如下:

function reverseStr(str = "www.toutiao.com") {
  let tmp = "",
    res = "",
    l = str.length - 1;
  while (true) {
    if (str[l] === ".") {
      res = res + tmp + ".";
      tmp = "";
      l--; //跳过字符串中的'.'
    }
    tmp = str[l] + tmp; //这里是做com,toutiao,www临时拼接
    if (l == 0) return res + tmp;
    l--;
  }
}

console.log(reverseStr()); //com.toutiao.www

第二到算法题:
查找链表最后的第K个节点,只能遍历一遍空间复杂度也为O(1).写完之后还写了一个生成一个链表,自己测试。

function getNodeK(head, k) {
  let p = (q = head);
  for (let i = 0; i < k-1; i++) { 
  //这个地方得注意,p和q的距离得-1,
  //才能保证当q☞最后一个节时,p☞最后第K个节点。
    q = q.next;
  }

  while (true) {
    if (q.next === null) {
      return p;
    }
    q = q.next;
    p = p.next;
  }
}

创建链表:

const createNode = (val) => {
  return {
    val,
    next: null,
  };
};
let h = (tmp = createNode(0));
for (let i = 0; i < 10; i++) {
  tmp.next = createNode(i + 1);
  tmp = tmp.next;
}

getNodeK(h, 7); //{ val: 4, next: { val: 5, next: { val: 6, next: [Object] } } }

这两道算法题都不难,但得注意细节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h沐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值