1面大概面了1个小时6分钟。主要是我话多。。。
主要面的是前端基础和算法
- 首先自我介绍
- 谈谈let、const和var,详细博文在这:let、const和var
- 说说基本类型和引用类型
- 考察了一道异步和事件循环看代码回答题
- 两道算法题
1、2和3本文就不说了。
第4个题目大概是这样的,问以下代码控制台输出什么?
setTimeout(console.log, 0, 0);
console.log(1);
new Promise((resolve, reject) => {
console.log(2);
for (let i = 0; i < 10000; i++) {
if (i === 9999) {
resolve();
}
}
console.log(4);
}).then(() => {
console.log(5);
});
console.log(6);
答案是:1 2 4 6 5 0,这个我答对了,你答对了吗?
但是下面这个我没对。。。。
setTimeout(console.log, 0, 0);
console.log(1);
new Promise((resolve, reject) => {
console.log(2);
//for (let i = 0; i < 10000; i++) {
// if (i === 9999) {
// resolve();
// }
//}
console.log(4);
}).then(() => {
console.log(5);
});
console.log(6);
问这个打印输出会有变化吗? 正确答案是1 2 4 6 0。
这个相关知识可以看【前端基础】简单易懂的Promise这篇博文。
最后就是做两道算法题:这两个算法题我也做出来了。
第一道算法题:
原地以.反转字符串,时间复杂度要求为O(1)即要求只遍历一遍 www.toutiao.com操作该字符串变为com.toutiao.www。
算法如下:
function reverseStr(str = "www.toutiao.com") {
let tmp = "",
res = "",
l = str.length - 1;
while (true) {
if (str[l] === ".") {
res = res + tmp + ".";
tmp = "";
l--; //跳过字符串中的'.'
}
tmp = str[l] + tmp; //这里是做com,toutiao,www临时拼接
if (l == 0) return res + tmp;
l--;
}
}
console.log(reverseStr()); //com.toutiao.www
第二到算法题:
查找链表最后的第K个节点,只能遍历一遍空间复杂度也为O(1).写完之后还写了一个生成一个链表,自己测试。
function getNodeK(head, k) {
let p = (q = head);
for (let i = 0; i < k-1; i++) {
//这个地方得注意,p和q的距离得-1,
//才能保证当q☞最后一个节时,p☞最后第K个节点。
q = q.next;
}
while (true) {
if (q.next === null) {
return p;
}
q = q.next;
p = p.next;
}
}
创建链表:
const createNode = (val) => {
return {
val,
next: null,
};
};
let h = (tmp = createNode(0));
for (let i = 0; i < 10; i++) {
tmp.next = createNode(i + 1);
tmp = tmp.next;
}
getNodeK(h, 7); //{ val: 4, next: { val: 5, next: { val: 6, next: [Object] } } }
这两道算法题都不难,但得注意细节。