2019.3.23——字节跳动前端实习面经

几天面的字节跳动,面到崩溃。写了两天作业,今天整理一下前两面我还记得的问题。
明天三面,多反思,加油加油加油!
首先是一面
本来约的是下午4点,然而五点半面试官才上线。
首先是介绍项目,然后给我出了第一道题目:

if (1 == ‘1’) { console.log(‘1’) }
if (1 === ‘1’) { console.log(‘2’) }
if ([1] == [1]) { console.log(‘3’) }
if ([1] === [1]) { console.log(‘4’) }
if (0.1 + 0.2 == 0.3) { console.log(‘5’) }
if (0.1 + 0.2 === 0.3) { console.log(‘6’) }

问输出结果是什么。
我当时对4和6有点迷,说数组的输出我不是很确定,但是我猜测四因为地址的比较,所以不能输出。浮点数的比较我对5也是不确定,但是我讲了存储问题,0.1+0.2>0.3
最后的结果是只有1输出,其他都没有输出。
第二题:
首先问了我对原型链的了解,然后让我用es5写一下类的原型继承:
给出的是:

function Person() {}
function Man() {}

因为之前知识了解方面的知识,没有真正地上手写过原型链的继承,所以写的不是很好。
在面试官的各种提示下,我写出的代码最终是这样的:
我之前用的new ,他说换成create更好。但是之前确实没有了解这两个的差别,补一个链接,说明这两个操作符有什么差别:
https://www.cnblogs.com/94pm/p/9113434.html

function Person(){
}
Person.prototype.name = "abc";

function Man(){
}

Man.prototype = object.create(Person);

第三题是问我知不知道es6的filter函数,我大致讲了一下。于是他让我自己实现一个myFilter函数,需要实现filter函数的相关功能。
对函数的功能的实现,我很快就写出来了,但是我对函数的熟悉程度还是不够,于是在它到底有几个参数上卡了不止一次。。。
最终写出的函数如下

Array.prototype.myFilter = function (func(index),obj){
    var Arr = this;
    var res = [];
    for(var i=0;i<Arr.length;i++){
        if(func.call(obj,this[i],i,this))
            res.push(Arr[i]);
    }
    return res;
}
    var res = arr.myfilter();

第四题是关于JS的任务执行顺序的解析

console.log('begin');
setTimeout(() => {
    console.log('setTimeout 1');
    Promise.resolve().then(() => {
        console.log('promise 1');
        setTimeout(() => {
            console.log('setTimeout2 between promise1&2');
        })
    }).then(() => {
        console.log('promise 2');
    });
}, 0);
console.log('end');

由于之前有认真花时间去了解JS的宏任务、微任务还有promise和setTimeout的执行,因此,我很顺利地把这道题做出来啦。(被面试官小小地夸奖了一下嘿嘿。当然还是因为这个题目比较基础。。。。

//微任务
begin;
end;

//宏任务
setTimeout 1
promise 1
promise 2
setTimeout2 between promise1&2

第五题写一个快排,前两天刚刚手撕一遍,很顺利写完了

function quickSort(Arra){
    var len = Arra.length;
    var middle = Arra[len/2];
    var left = [];
    var right = [];
    Arra.splice(middle,1);
    for(var i=0;i<Arra.length;i++){
        if(Arra[i]>=Arra[middle]){
            right.push(Arra[i]);
        }
        else left.push(Arra[i]);
    }
    return quickSort(left).concat(Arra[middle],quickSort(right));
}

上面五道题目是平台记录的。其他问的问题就没有记得很清楚。
记得的是,首先问我在做项目的时候如果有多人合作,怎么来进行代码规范。这个问题其实是因为我写代码的个人色彩十分浓重。。。比如函数命名用了quick_sort,于是被识破没有看过代码规范。。。我首先很诚实地承认,我做项目的都是一个人做的,没有遇到过大型的需要多人合作的项目。然后试着分析了一下情况,会倾向于让大家在开始做项目之前,对具体的全局变量,代码格式之类的进行事前的统一。
然后面试官很nice地为我推荐了一些JS做项目的规范,并跟我讲,要多了解相关的东西,因为以后到公司需要跟别人合作,这些知识还是很重要的!
他提到了一个代码规范工具,然我有空去了解一下 :ESlink
https://cn.eslint.org/
我还有查到其他的工具,例如prettier:https://prettier.io/
然后就忘记怎么提到了typescript,我就说我确实没有很了解,只知道是某种框架。于是他就很热心地为我解释了,vue是怎么错过了typescript的春风并努力补救的过程,还是蛮有意思的~
官网链接:https://www.tslang.cn/
然后问我的问题记不太清楚了。
哦对,还问了关于浏览器从输入url到页面渲染的过程,这次回答得很顺畅。。。
二面
在我跟上一个面试官友好告别,收拾东西准备回去睡觉的时候,收到了二面的短信和邮件。。。
于是出去走了一圈,又点了一杯美式,开始了二面。。。
二面依旧自我介绍,项目介绍,巴拉巴拉。
面试官又问我:从url被输入到浏览器渲染经过了什么过程。。。
我:这个上一面问过了。。。
他:再讲一遍。
我:(无辜。。好。。。巴拉巴拉
问我进程和线程,我讲了一堆。提到了堆是进程的,栈是线程的。
然后问我堆和栈的区别。然后我就介绍了一下数据结构中的堆和栈。
然后他就问我,在计算机中用到的堆和栈和我介绍的有什么区别和联系。(我???)就一个是理论上的东西,一个是物理实现啊。。。下来想想,觉得他是想问我,浏览器中的堆栈管理或者JS中的堆栈管理,看我不会,就没问(之前真的没准备过这方面的,疏忽了。。。)
JS堆栈:https://www.cnblogs.com/jiangk1214/p/6650957.html
https://www.cnblogs.com/web-easy/p/7889184.html
浏览器堆栈:https://www.cnblogs.com/accordion/p/5699372.html
然后问了浏览器的内存管理。
我就从cookie讲到localstorage
他就问我,在之前的url输入到浏览器渲染完成的过程中,是怎么使用相关存储的。我就只能现场分析,首先URL解析,DNS都有用到本地存储,然后就是请求资源,对比etag和if-modified-since,如果确认资源没有改变就返回304错误,否则更新,返回200。
然后就是做题
首先出了一道题,让我实现版本号的比较。具体题目被删掉了,我找到了一个很像的:

例如现在存在一组版本号,[‘0.1.1’, ‘2.3.3’, ‘0.3002.1’, ‘4.2’, ‘4.3.5’, ‘4.3.4.5’],怎么对这个版本号进行排序,实现最后排序的结果为[‘4.3.5’,‘4.3.4.5’,‘2.3.3’,‘0.3002.1’,‘0.1.1’];

我当时是实在是被问得懵掉了,写代码就一直卡壳儿,就说,我知道思路,我先讲思路您看对不对,就说运用正则和循环比较。
他说思路可以,要写出来,我就说我写不出来,有些语法忘记了。。。
贴一个代码(其实可以不用正则,当时是真的累了)

var arr = ['0.1.1', '2.3.3', '0.3002.1', '4.2', '4.3.5', '4.3.4.5']
arr.sort((a,b)=>{
    var items1 = a.split('.')
    var items2 = b.split('.')
    var k = 0
    for (let i in items1) {
      let a1 = items1[i]
      let b1 = items2[i]
      if (typeof a1 === undefined) {
        k = -1
        break
      } else if (typeof b1 === undefined) {
        k = 1
        break
      } else {
        if (a1 === b1) {
          continue
        }
        k = Number(a1) - Number(b1)
        break
      }
    }
    return k
})
console.log(arr)

然后面试官给了我一个比较简答的题目

大括号闭合
var expression = “{{}}{}{}”
var expressionFalse = “{}{{}”;
function isBalanced(exp) {}

这道题我之前做过,先想到了比较左右括号的数目,但是我记得还有别的情况。在面试官的提醒下,选择用栈来做,很简单。
然后就是问一些项目相关的。问我在整个前端工程中的工作。我就从搭建开始,写代码,打包上线。然后他就问我在项目过程中有没有什么让我很不喜欢的事情。我就讲我最后打包上线的时候报错,和别人的nodejs版本不一样,重装就很麻烦。事前没有沟通好。
他就问我项目流程有没有可以优化的,我讲不太出来,他就问,我那个版本问题有没有解决办法。我说就事先沟通好。他说其实可以写一个总的文件来安装。然后我就反应过来,赶快说把各种环境的版本和安装指令写好,直接运行这个脚本实现环境的搭建就不会出现问题了。又扯了一下loader。
二面没想过回过。。。毕竟我说我很困,面试官让我早点休息来着。。。

挂掉的三面
面试官上来就做题:
题一:给出一个n,输出包含n对括号的所有可能组合。
我提到了动态规划,面试官说回溯也可以,我写了一半,大概写得太烂了,被叫停。

func print(int n)
()

(())
()()

((()))
(()())
()()()

第二题:0-9和a-z分别表示36进制数的0-36,写一个加法。

0-9a-z 36进制数
“1b", "2x" = "48"
"zzz", "1" = "1000"

我写的大致如下,没跑通。。。。

function sum (str1,str2){
    var arr1 = str1.split("");
    var arr2 = str2.split("");
    var arr3 = arr1.reverse();
    var arr4 = arr2.reverse();
    var len1 = arr3.length;
    var len2 = arr4.length;
    var res = [];
    for(var i=0;i<len1;i++){
        if(arr3[i]>='a'&&arr3[i]<='z')
        arr3[i] = arr3[i].charCodeAt()-87;
    }
    for(var i=0;i<len2;i++){
        if(arr4[i]>='a'&&arr4[i]<='z')
        arr4[i] = arr4[i].charCodeAt()-87;
    }
    var carry = 0;
    if(len1>=len2){
        for(var i=0;i<len2;i++){
            var r = (parseInt(arr3[i])+parseInt(arr4[i])+carry)%36;
            carry = r/36;
            var rr = r+"";
            res.push(r);
        }
        for(var i=len2;i<len1;i++){
            var r = (parseInt(arr3[i])+carry)%36;
            carry = r/36;
            var rr = r+"";
            res.push(r);
        }
    }
    else if(len1<len2){
       for(var i=0;i<len1;i++){
            var r = (parseInt(arr3[i])+parseInt(arr4[i])+carry)%36;
            carry = r/36;
            var rr = r+"";
            res.push(r);
        }
        for(var i=len1;i<len2;i++){
            var r = (parsInt(arr4[i])+carry)%36;
            carry = r/36;
            var rr = r+"";
            res.push(r);
        }
    }
    for(var i=0;i<res.length;i++){
        res[i] = res[i].fromCharCode();
    }
    res.reverse();
    console.log(res);
}
sum("1b","2x");

第三题:

给出记录,分别表示开始在线的时间和结束在线的时间
求出每天的每一秒钟在线的人数。
1 5
2 6
1 6
2 5
3 4

2 4 5 3 2 0 0 0

L 10亿//记录数目
K 3600//平均在线时长
M 86400//每天的秒数

为什么我的算法这么差!!!

猜你喜欢

转载自blog.csdn.net/shadothew/article/details/88819407