21届大三面试凉经(阿里字节)

3,016 阅读4分钟
> ### 概述:某不知名211大三,字节三面挂,阿里二面挂……

字节一面

用时共一小时

  • 提了一嘴项目,解释了一下
  • css 实现一个长方形,宽度挤满页面,长度是宽度两倍。
  • 浏览器事件循环机制(event-loop),然后给了个还挺复杂promise和setTimeout,问输出值
  • 知道捕获和冒泡吗?
  • 知道http状态码吗?302指的什么意思?
  • http tcp udp
  • 进程和线程分别是什么,有什么区别
  • 浏览器是单线程的吗?它的其他线程可以说出来几个吗?
  • (写代码)实现判断二叉树中是否有从根节点到叶子节点value累加为n
  • (写代码)一个单链表,拿倒数第K个的指针引用
  • (写代码)两个版本号比较返回大的那个(格式:xxx.xxx.xxx),如果是数字怎么判断,如果是字母呢?

字节二面

用时共五十分钟

  • 听说上次面试你缓存答的不是很好,下来有看嘛……我……?一面有问?😭
  • http2有了解嘛
  • (写代码)实现一个body下的所有tagName统计并记录出现次数,然后再从中拿到出现次数第k大的元素的tagName和times(次数)
  • 聊聊你的项目吧,介绍一下出现的背景,即大概实现机制
  • 后端的egg有深入了解嘛 (不过说了下个计划深入node)
  • 班级一年班长经历能聊聊嘛
  • 平时怎么学习的呀……
  • 为什么选择从事前端这个行业……

字节三面

用时共五十分钟

  • 实现一个效果,扒拉扒拉扒拉…… absolute和fix有什么区别?
  • addEventListener 除了click,hover 还有什么?
  • 啥时候接触前端的呀
  • 实现便利递归到父元素
  • 两个栈实现一个队列
  • 对 js 什么了解最深
  • 职业规划
  • 发送请求流程有了解嘛
  • (因为网不好,他说快点聊算了😭)巴拉巴拉吧啦

阿里一面

用时共一个小时

笔试(答案是当时面试系统直接发邮件发回来的,不保证能直接运行,大体思路没错)

用时共三十分钟

/**
 * 1. 查找落单的数字
 * 描述:给定一个非空的数字数组,数组有且只有一个非重复项,实现一个方法获取落单项
 * 示例:
 *  getSingleNumber([1, 2, 1, 2, 0]); // 0
 *  getSingleNumber([0, 1, 0, 0]); // 1
 *  getSingleNumber([1, 2, 3, 1, 2]); // 3
 */
 
//评论区来的,这个应该考的是异或
const getSingleNumber = (numbers) => {
    return numbers.reduce((acc,cur)=>acc^cur)
}

function getSingleNumber(numbers) {
  const map = new Map();
  numbers.forEach((item) => {
  	map.has(item)?
      map.set(item, map.get(item)+1):
      map.set(item, 1);
  })
  
  const vec = [...map];
  
  for(let i = 0,len = vec.length;i<len;i++) {
    if(vec[i][1] === 1) {
    	return vec[i][0];
    }
  }
  
  return false;
}

/**
 * 2. 找出数组中第k大和第m大的数字相加之和
 * 说明:实现一个方法,找出数组中第k大的和第m大的数字相加之和
 * 示例:
 *   let arr = [1,2,4,4,3,5], k = 2, m = 4
 *   findTopSum(arr, k, m); // 第2大的数是4,出现2次,第4大的是2,出现1次,所以结果为10
 */


function findTopSum(arr, k, m) {
  //[5,4,4,3,2,1]
  const map = new Map();
  arr.forEach((item) => {
  	map.has(item)?
      map.set(item, map.get(item)+1):
      map.set(item, 1);
  })
  //排序,需要写快排的话,后期加上
  const vec = [...new Set(arr)];
  vec.sort((a, b) => b-a)
  
  let [numK,numM] = [vec[k-1], vec[m-1]];
  
  return numK*map.get(numK) + numM*map.get(numM)
}

/**
 * 3. 获取嵌套数组深度
 * 说明:给定一个带嵌套的数组,实现一个方法可获取嵌套数组的最大深度,
 *   数组无嵌套子数组,则返回0,有一层嵌套子数组则1,依此类推。
 * 示例:
 *   getArrayDeep([1, 2, [3, [1, [0]]]]); // 返回 3
 *   getArrayDeep([]); // 返回 0
 *   getArrayDeep([[[[]]]]); // 返回 3
 *   getArrayDeep([0, [2], [2, [3]]]); // 返回 2
 */
function getArrayDeep(arr) {
  let res = 0;
  
  const dfs = (vec, cur) => {
    res = Math.max(res, cur);
  	vec.forEach((item) => {
    	if(item instanceof Array) {
        	dfs(item, cur+1);
        }
    })
  }
  
  dfs(arr, 0);
  
  return res;
}


/**
 * 4. 设计一个简单的红绿灯策略,红灯亮为console.log(“red”),黄灯亮为console.log("yellow"), 绿灯亮为console.log("green"),
 * 要求按照红3s-黄1s-绿3s顺序不断循环展示
 */

const sleep = (time) => {
	return new Promise((resolve, reject) => {
    	setTimeout(resolve, time)
    })
}

function main = () => {
  red();
}

function red() {
  console.log(“red”);
  sleep(3000).then(()=>{
    yellow();
  })
}

function yellow() {
  console.log(“yellow”);
  sleep(1000).then(()=>{
    green();
  })
}

function green() {
  console.log(“green”);
  sleep(3000).then(()=>{
    red();
  })
}

电话面试:

用时共三十分钟

  • 项目
  • 一年班长经历
  • apply, call, bind
  • vue react 区别,有了react为什么还要有vue
  • react hooks ,react hooks 好在哪
  • node 单线程
  • js 继承, es6和es5继承有什么区别
  • js 委托

阿里二面

用时共三十分钟

  • 描述一下你的项目(要能讲懂的那种,真的费劲)
  • 说说react好在哪
  • 讲讲闭包是什么
  • 闭包的用处和问题
  • 闭包为什么会引起内存泄漏
  • 。。。其他的忘了