首页 > 字节提前批 杭州飞书前端 凉经(四面的一周后收到感谢信)
头像
Nodeath_007
编辑于 2020-08-15 11:29
+ 关注

字节提前批 杭州飞书前端 凉经(四面的一周后收到感谢信)

一面
听你说你刷了些 lt 算法题,来,我们先做道题
1. 给一个无序数组,让你判断能否组成一个等差数列(排序算法很简单,不排序呢)。
排序算法,先排序,取最小值及次小值 ,相减得差,挨个便利数组元素比差。
非排序算法,第一次遍历取最小值,第二次遍历取次小值,数组中每个元素与最小值的差 除以 次小值跟最小值的差是整数倍,通过一个数组记录其是否出现过。
// 排序实现
const isArithmeticSequence = function (arr) {
    let len = arr.length;
    if (len <= 2) {
        return true;
    }
    arr.sort((a, b) => a - b);
    let gap = arr[1] - arr[0];
    for (let i = 2; i < len; i++) {
        if (arr[i] - arr[i - 1] !== gap) {
            return false;
        }
    }
    return true;
}
let arr = [2, 4, 6, 10, 8, 12];
console.log(isArithmeticSequence(arr)); // true
console.log(isArithmeticSequence([2, 5, 6, 8, 10])); // false


// 非排序实现
const isArithmeticSequence = function (arr) {
    let len = arr.length;
    if (len <= 2) {
        return true;
    }
    let min1 = Math.min(...arr);
    let minIndex = arr.indexOf(min1);
    let min2 = Math.min(...arr.slice(0, minIndex), ...arr.slice(minIndex + 1));
    let gap = min2 - min1;
    let set = Array(len).fill(0);
    for (let num of arr) {
        let times = (num - min1) / gap;
        if (set[times] === 0) {
            set[times] = 1;
        } else {
            return false;
        }
    }
    return true;
}
let arr = [2, 4, 6, 10, 8, 12];
console.log(isArithmeticSequence(arr)); // true
console.log(isArithmeticSequence([2, 5, 6, 8, 10])); // false
实际面试过程中,非排序算法面试官给了提示,也没让我具体写。在时间复杂度上,排序O(nlogn)),非排序 O(n),即线性复杂度,这也是面试官考察面试者非排序算法的原因。

2. 数据整合
let input = [{ count: 1, value: 2 }, { count: 3, request: 2}, { response: 0 } ];  // => {count: 4, value: 2 ......}
const addAll = function (input) {
  let res = {};
  input.forEach((obj) => {
    Object.keys(obj).forEach((k) => {
      if (res[k] === undefined) {
        res[k] = obj[k];
      } else {
        res[k] += obj[k];
      }
    })
  })
  return res;
}
console.log(addAll(input)); // { count: 4, value: 2, request: 2, response: 0 }
用 reduce 也行,感兴趣的同学可以自己试下。

3. 你刷过lt,一定知道有效的括号,给出一个数字 n , 表示有 n 对括号" () ",需要返回能够组成的有效的括号序列的组合数,不需要输出具体的组合方式。
听到面试官说不要返回组合方式,第一反应是 dp 。后面在面试官给到了转移方程的前提下写完了代码。
const validParenthesesCnt = function (n) {
  let dp = Array(n + 1).fill(0);
  dp[0] = 1;
  for (let i = 1; i <= n; i++) {
    for (let j = 0; j < i; j++) {
      dp[i] = dp[i] + dp[j] * dp[i - j - 1];
    }
  }
  return dp[n];
}
console.log(validParenthesesCnt(0)); // 1
console.log(validParenthesesCnt(1)); // 1  ()
console.log(validParenthesesCnt(2)); // 2  ()() (())
console.log(validParenthesesCnt(3)); // 5 ((())) ()()() (())() ()(()) (()())
4. 鼠标悬停,展示下拉菜单;如何不依赖js实现
当时说伪类:hover 配合 visibility 属性(说的不对的地方还请各位牛友指正)。
.button .drop-down {
    visibility: hidden;
}
.button:hover .drop-down {
    visibility: visiable;
}
5. 实现 useToggle,为难.jpg,面试官表示辣我也不为难你。
6.反问:你对应届生的预期。 面试官:说实话你还蛮符合我对应届生的预期的。  双方蛤蛤蛤蛤蛤。

二面

1. 填充 inherit 完成输出。
function inherit() {
  
}

let animalNum = 0;
function Animal(name) {
  animalNum ++;
  this.name = name;
}
Animal.prototype.getName = function() {
  return this.name;
};
const Cat = inherit(Animal, {  
    say:function() {
        console.log(`NO${animalNum}:${this.getName()}`);
    }
});
const cat1 = new Cat('小花');
cat1.say(); // NO1:小花
本来想推荐有兴趣的同学搜一下 mdn object.create() 的,不知道是不是因为 Mozilla 裁员的关系,至少我这儿 mdn 官网打不开。。。
实现(注释里头提供了一种备选的方式):
function inherit(Fn,obj) {
  function ret (name) {
    Fn.call(this, name);
  }
  // function F () {}
  // F.prototype = Fn.prototype;
  // var prototype = new F(); //创建对象
  // Object.assign(prototype, obj);
  // prototype.constructor = ret; //增强对象
  // ret.prototype = prototype; //指定对象
  ret.prototype = Object.create(Fn.prototype);
  Object.assign(ret.prototype, obj);
  ret.prototype.constructor = ret;
  return ret;
}
2. 给你一个存放 url 的数组,要求按序请求资源, 用fetch请求就行,关键词: map, Promise, reduce
3. 优化项目的手段有哪些?
(1) http 缓存
(2) 负载均衡
(3) script async defer,async 不保证执行顺序, defer 保证顺序。
(4) 减少回流和重绘,改变 offsetHeight, offsetWeight 的值会导致回流,那单纯的访问呢,也会~
(5) 事件委托
。。。。。。。。。
二面效果一般,但是末了面试官还是说后续 hr 会联系你的。

三面
1. lt 130 被围绕的区域,将被围绕的 0 替换成 1,思路,对外圈的 0 做 dfs ,将其所连通的 0 替换成 '#' (任意非1的数据),然后整体遍历数组,0 => 1,'#' => 0。

1 1 0 1              1 1 0 1
0 1 0 1      =>    0 1 0 1
1 0 1 1              1 1 1 1
1 1 1 0              1 1 1 0

10分钟A了
2. https 建连过程
3. event loop, 看代码说输出,解释原因。
问:假如给你offer你能提前过来实习么?
答: 如果是正式 offer 那我很乐意来。

一周后 hr面
为什么要学计算机。经历过的项目。如何学习前端的。职业规划。。。。。

一周后(8.14)收到感谢信,捂泪哭,嘤嘤嘤。
原本以为跟三面面试官聊得好好的,以为稳了呢,哎。

更多模拟面试

全部评论

(10) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐