这是我今年准备面试来的第一家公司,抱着试试的心态(这个心态不太对,我们应该做什么都认真)。让我们来看看面试经过以及面试题吧。
约面试
3月1日早上接到Hr电话(其实2.28日就给我打了电话,但是当时在公司的会上,被我挂断了,我没有回电话的习惯,所以也没有打回去)。
hr: 简单介绍公司,询问我什么时候有时间面试?
我:可以下周吗?(我觉得我没有准备好,所以想推迟一点)
hr:今天没有时间吗?今天下午没有时间吗?
我:我现在还在职,下午没有时间!
hr:晚上8:30可以吗?
我内心os这是什么公司,晚上8:30还在上班,虽然我现在公司也是日常21点下班。
我:可以。
hr:那请你关注下boss上的消息,稍后我把视频面试地址发给你。
我:好的。
嗯……,到了晚上6点多的时候,我还没收到这位hr的消息(因为我目前就投了3家公司,所以很容易找到),我就给hr发消息了
我:你好,请问今天晚上8:30还面试吗?我们上午沟通过
hr:对不起,我以为给你发了消息了,……(面试地址发过来了)
面试
因为预估我会迟到一会儿,我提前给hr说了,但是最后我在8:31的时候,进入了面试。
(一看面试官的名字,是个小姐姐,好像就没那么紧张了)
-
那肯定是自我介绍(拒绝尴尬,主动说那我先进行自我介绍吧) 我xxx毕业,xxx在xxx实习,主要负责xxx开发,然后xxx来的现在公司,主要负责xxx业务,平日主要工作是做xxx。主要用到的技术栈是xxx
-
看你很多项目都是写的负责人 我们这边是按模块划分的,我独立负责这几个模块,以及相关人员分配和引导新人成长
(当时面试的时候,可能稍微有点紧张,所以表述不是很清楚,希望小姐姐听明白了) -
看你用的都是公司自研的技术栈,如果转react,从0开始学习有问题吗?
我觉得我是没问题的,【就我简历中也涉及到好几种技术栈,在刚接手的时候都是从0开始学习的】,转技术栈是不难的,难的是对这些问题的思考和认知能力。
(【】中的内容,是我整理面试的时候加上的,面试中没有这句,当时没反应过来可以举例说明) -
这边大多是负责从0到1的负责项目,你觉得你可以吗 ? 虽然我目前还没有0到1的项目经验,但是我觉得我是没有问题的。
(这儿其实还可以举例说明,哪些地方体现我们是可以胜任的,ps:我也不是完全没有0到1的经验) -
那我们接下来看三道面试题吧 然后小姐姐就发了一个连接过来,需要共享屏幕,前面说了这是我今年第一场面试,所以需要打开权限啥的,对腾讯会议使用也不是很熟悉。小姐姐还是很耐心的给我说要点击那儿(温柔的小姐姐,哈哈哈哈哈)。
-
面试题1: 看代码的执行结果
这个题设定是一个选择题,选项比较多,我就不写了(面试的时候,我也没看选项,直接说答案)
new Promise(resolve => {
console.log(1);
setTimeout(resolve, 100, 2);
console.log(3);
}).then(data => {
console.log(data)
})
答案是: 1 3 2
考点:
- Event Loop 的执行。这个大家可以参考我以前的文章 Event Loop
- setTimeout可以传入三个参数,第三个参数为第一个回调函数的入参,这个考察点真的是非常细节了,认真看文档的重要性呀!!!
- 面试题2: 阅读下方程序,写出或者简短描述函数调用:fun(2,3,4)的输出结果
(内心os,这这怎么还来上递归,这一连串又是啥玩意儿,毕竟是面试,上吧,一步一步的解析)
function fun(...dimentions) {
const [layer, ...d] = dimentions;
return d.length ? Array(layer).fill(0).map(_ => fun(...d)) : Array(layer);
}
先上 fun(2,3,4)的执行结果吧,是一个三位数组,如下图
解释执行经过:
- 解释了下解构,layer的值和d的值
- 解释了 三目运算的执行逻辑
- Array(layer)的执行结果,(面试的时候,我把这个第一次的说错,正确的时候返回长度为layer的稀松数组,小姐姐提示下,我意识到自己说错了)
- fill(0),将数组的填充0,填充多少次,由数组的长度决定,接下来调用map函数
- 嗯,执行过程算是解释完成
追问1:这函数的执行结果是啥
内心os,我的天,这玩意儿执行结果是啥,最怕递归了(现阶段最怕的东西了,哈哈哈哈哈)。
最终还是回答错误了(意料之中,意料之中)。友情提示下,面试记得带笔和纸,否则你就能只用脑袋想了,希望你不晕
追问2: 为什么需要fill(0)
因为Array函数执行完毕后,只是改了数组的长度,元素实际是没有元素的,所以在调用map的时候,回调函数是不会执行的。
- 不知道这个的孩子,好好研究下数组的api, JS数组方法比较.
- 建议看MDN上的说明,菜鸟教程上面我个人觉得有的对入参是否必须的描述是存在问题的。
考点:
- 递归
- 数组的常用api
- es6的基础语法
- 面试题3: 算法,二叉树 + 数组
给一个二叉__树,实现函数判断其叶节点数值从左到右是否为等差数列。如下左图所示的二叉树,其叶节点[1,3,5,7]为等差数列,返回True。
注:输入参数为有left,right和val的Object。如下右图二叉树,其数据为右下图所示 Object。
答案1: (我在面试中回答的,面试中,我只是遍历出来所有的叶子结点后,我就没写了,后面就是判断数组是否是等差数列了,看到公司有找我,想着比较简单,就不写了,就给面试官小姐姐说了下思路)
const isArithmetic = function(root) {
let arr = [];
const search = function(node) {
if(!node) {
return;
}
if(!node.left && !node.right) {
arr.push(node.val);
}
if(node.left) {
search(node.left);
}
if(node.right) {
search(node.right);
}
}
search(root);
console.log(arr);
const pre = arr[1] - arr[0];
for(let i = 2; i < arr.length; i++) {
if(arr[i] - arr[i -1] !== pre) {
return false;
}
}
return true
}
思路:
- 第一步获取所有的字节点,并用数组保存
- 判断数组是否是等差数列
缺点:这个方法有点暴力,有一个递归 + 循环,可以把循环去掉的,面试中,直接用了这个暴力的方式进行解决了。
答案2:优化后的
嗯,虽然是优化后的,但是看着也不简单,可能是我算法比较差。
const isArithmetic2 = function(root) {
let preDis; let pre; res = true;
const search = function(node) {
if(!node || !res) {
return;
}
if(!node.left && !node.right) {
if(pre === undefined) {
pre = node.val;
}
else if(preDis === undefined) {
preDis = pre - node.val;
pre = node.val;
}
else {
const dis = pre - node.val;
if(dis !== preDis) {
return res = false;
}
pre = node.val;
}
return ;
}
if(node.left) {
search(node.left);
}
if(node.right) {
search(node.right);
}
}
search(root);
return res;
}
面试收尾
最后简单和小姐姐了下下班时间 已经 公司的组织架构,这一部分就不写在问文档中了。