前言
开年第一场篮球赛,目的是想看看自己当前的能力水平,结局不甚理想,但是收获颇丰。
整场面试基于四道手撕展开,没有八股文,完全暴露了自己的基础还有很大的提升空间。
PS: 面试前背了好多八股文都没用上 QAQ
手撕
1.版本号比较
问题:实现一个方法,用于比较两个版本号(version1、version2
如果version1 > version2,返回1;如果version1 < version2,返回-1,其他情况返回0
示例:
compareVersion('0.1', '1.1.1'); // 返回-1
compareVersion('13.37', '1.2 '); // 返回1
compareVersion('1.1', '1.1.0'); // 返回0
思路暴力破解并补全
const compareVersion = (version1, version2) => {
let v1 = version1.trim().split('.');
let v2 = version2.trim().split('.');
let len = Math.max(v1.length, v2.length);
while (v1.length < len) {
v1.push('0');
}
while (v2.length < len) {
v2.push('0');
}
for (let i = 0; i < len; i++) {
const num1 = parseInt(v1[i]);
const num2 = parseInt(v2[i]);
if (num1 > num2) {
return 1;
} else if (num1 < num2) {
return -1;
}
}
return 0;
}
面试官提问:代码中两个while的目的是什么,如果要你优化这段代码怎么做,提高代码可读性?
一开始其实没反应过来,后来在面试官的引导下思考出,pareseInt中做优化
const num1 = parseInt(v1[i] || '0');
const num2 = parseInt(v2[i] || '0');
2.动态插入JS
问题:在head标签最下面插入动态插入一段JS代码,原生JS写法是怎么写的
比较简单的JS基础问题
const head = document.getElementsByTagName('head');
const scrpit = document.createElement('script');
// script 相关具体内容
// ...
head[0].appendChild(scrpit);
面试官:浏览器渲染过程中遇到srcipt标签会怎样,如果在script中有获取dom的操作会怎么样,该怎么解决。
浏览器解析文档时,默认按照排列顺序由上向下解析,当遇到script标签时,和其他标签元素一样,会先解析该script,解析完成后再继续向下走完成剩余文档的解析和渲染。也就是说默认情况下,script脚本会阻塞文档的解析渲染。
如果在script中,如果执行获取head之后的dom元素,由于dom还未完成渲染,会导致获取不到以至于报错,并阻塞渲染,以至于页面无法展现。
解决方法:script标签有两个属性,一个是defer,即延迟;二是aync,即异步,这两个属性都可以改变脚本的加载执行方式。
3.对象一致
问题:用原生的js编写比较两个“js对象”是否一致,(深度比较,例如:a = {x:1}和b = {x:1},a和b一致
循环递归
const equals = (a, b) => {
let arrayA = Object.getOwnPropertyNames(a);
let arrayB = Object.getOwnPropertyNames(b);
// 长度判断
if (arrayA.length !== arrayB.length) {
return false;
}
for (let i = 0; i < arrayA.length; i++) {
let nameA = arrayA[i];
let nameB = arrayB[i];
if (!a.hasOwnProperty(nameB)) {
return false;
}
// 递归判断
if (a instanceof Object) {
if (!equals(a[nameA], b[nameB])) {
return false;
}
} else {
if (a[nameA] !== b[nameB]) {
return false
}
}
}
return true
}
面试官:一开始你写了JSON.stringify,这个可以吗,有什么问题?
自己一开始其实是写了JSON.stringify 可以做到,但是题目要求深度比较,于是想到了如果定义对象时key的顺序变化,其实转JSON之后是不一致的,所以还是得循环递归。
4.算法题
问题:找到字符串中单个字符最长的连续循环次数。比如QWERXXXAX => 3
算法菜鸟,思路就是暴力
// 获取从 i起的最长连续
const getImax = (strs, str, strat, len) => {
let size = 0;
for (let i = strat; i < len; i++) {
if (strs[i] == str ) {
size++
} else {
// 当时紧张此处漏掉了,导致结果不是连续最长
return size
}
}
return size;
}
const getMax = (strs) => {
let maxCount = 0;
if (!strs) {
return 0;
}
for (let i = 0; i < strs.length; i++) {
if (maxCount >= strs.length - 1) {
return maxCount;
}
let max = getImax(strs, strs[i], i, strs.length);
maxCount = Math.max(max, maxCount);
i += max > 0 ? max - 1 : 0;
}
return maxCount;
}
整体写题写了快四十分钟,面试官对每道题都做出了提问以及引导,人真的非常nice,因为没办法run,所以基本上也都是写完凭感觉,基于题目中涉及到的点,以及我在写题过程中的点,进行了提问,大概聊了二十种。
简历提问
介绍一下自己的工作内容,以及一些项目经历,整体聊了十多分钟吧,最后就相互闲聊了一些,面试官给了很好的建议,包括自己的简历,包括如何提高自己在业务中去沉底自己的深度。
总得来说道阻且长,难度一般,但是自己的表现并不够好,再接再厉吧~
最后用一段自己喜欢的话勉励一下自己吧
光阴者百代之过客也,唯有奋力奔跑,方能生逢其时,是时代造英雄,英雄存在于时代