智谱华章前端面试(一面)

1,396 阅读6分钟

这是我今年准备面试来的第一家公司,抱着试试的心态(这个心态不太对,我们应该做什么都认真)。让我们来看看面试经过以及面试题吧。

约面试

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的时候,进入了面试。
(一看面试官的名字,是个小姐姐,好像就没那么紧张了)

  1. 那肯定是自我介绍(拒绝尴尬,主动说那我先进行自我介绍吧) 我xxx毕业,xxx在xxx实习,主要负责xxx开发,然后xxx来的现在公司,主要负责xxx业务,平日主要工作是做xxx。主要用到的技术栈是xxx

  2. 看你很多项目都是写的负责人 我们这边是按模块划分的,我独立负责这几个模块,以及相关人员分配和引导新人成长
    (当时面试的时候,可能稍微有点紧张,所以表述不是很清楚,希望小姐姐听明白了)

  3. 看你用的都是公司自研的技术栈,如果转react,从0开始学习有问题吗?
    我觉得我是没问题的,【就我简历中也涉及到好几种技术栈,在刚接手的时候都是从0开始学习的】,转技术栈是不难的,难的是对这些问题的思考和认知能力。
    (【】中的内容,是我整理面试的时候加上的,面试中没有这句,当时没反应过来可以举例说明)

  4. 这边大多是负责从0到1的负责项目,你觉得你可以吗 ? 虽然我目前还没有0到1的项目经验,但是我觉得我是没有问题的。
    (这儿其实还可以举例说明,哪些地方体现我们是可以胜任的,ps:我也不是完全没有0到1的经验)

  5. 那我们接下来看三道面试题吧 然后小姐姐就发了一个连接过来,需要共享屏幕,前面说了这是我今年第一场面试,所以需要打开权限啥的,对腾讯会议使用也不是很熟悉。小姐姐还是很耐心的给我说要点击那儿(温柔的小姐姐,哈哈哈哈哈)。

  6. 面试题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可以传入三个参数,第三个参数为第一个回调函数的入参,这个考察点真的是非常细节了,认真看文档的重要性呀!!!
  1. 面试题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)的执行结果吧,是一个三位数组,如下图 image.png

解释执行经过:

  • 解释了下解构,layer的值和d的值
  • 解释了 三目运算的执行逻辑
  • Array(layer)的执行结果,(面试的时候,我把这个第一次的说错,正确的时候返回长度为layer的稀松数组,小姐姐提示下,我意识到自己说错了)
  • fill(0),将数组的填充0,填充多少次,由数组的长度决定,接下来调用map函数
  • 嗯,执行过程算是解释完成

追问1:这函数的执行结果是啥
内心os,我的天,这玩意儿执行结果是啥,最怕递归了(现阶段最怕的东西了,哈哈哈哈哈)。 最终还是回答错误了(意料之中,意料之中)。友情提示下,面试记得带笔和纸,否则你就能只用脑袋想了,希望你不晕

追问2: 为什么需要fill(0)
因为Array函数执行完毕后,只是改了数组的长度,元素实际是没有元素的,所以在调用map的时候,回调函数是不会执行的。

  • 不知道这个的孩子,好好研究下数组的api, JS数组方法比较.
  • 建议看MDN上的说明,菜鸟教程上面我个人觉得有的对入参是否必须的描述是存在问题的。

考点:

  • 递归
  • 数组的常用api
  • es6的基础语法
  1. 面试题3: 算法,二叉树 + 数组 给一个二叉__树,实现函数判断其叶节点数值从左到右是否为等差数列。如下左图所示的二叉树,其叶节点[1,3,5,7]为等差数列,返回True。 注:输入参数为有left,right和val的Object。如下右图二叉树,其数据为右下图所示 Object。 image.png 答案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;
}

面试收尾

最后简单和小姐姐了下下班时间 已经 公司的组织架构,这一部分就不写在问文档中了。