面试题
以前也只是听说大厂面试要手撕代码,今天确实亲身体会了,接下来就奉献出机会不多的经验
1.自我介绍完,聊一下做过的项目,(我这里说了我在某讯开发部署的经验,所以这里聊了下)
2.简单的出个题,用两个栈Stack实现一个队列Queue,栈用数组模拟(手写代码而且是,你写一行面试官就能看见一行的那种)
//两个数组模拟栈的行为
var stack1=[],//存储栈
stack2=[];//辅助栈
//栈是后入先出(LIFO,last in first out),队列是先入先出(FIFO,first in first out)
//队列插入元素函数
function push(ele)
{
//模拟队列的push操作,直接往存储栈stack1中推入即可
//但是要考虑辅助栈stack2中还存在值的情况,需要先将辅助栈中的值推回存储栈中
while(stack2.length !== 0){
stack1.push(stack2.pop());
}
stack1.push(ele);
}
//队列删除元素函数
function pop()
{
//模拟队列的pop操作则要考虑栈的后入先出特性,需要先将存储栈stack1中的数组,推入辅助栈stack2,然后辅助栈弹出元素
while(stack1.length !== 0){
stack2.push(stack1.pop());
}
return stack2.pop();
}
当然我是没能写出来,一直在写项目,没有复习过数据结构的面试题,以为只问项目,是我单纯了,
3.那我们换一个,斐波那契数列计算出fn(100)吧
function fb1(n){
if(n <= 2){
return 1;
}else{
return fb1(n-1) + fb1(n-2);
}
}
这个就还好,不记得现做也行,然后问这个实现的时间复杂度是多少
我:???
正解:o(2^n)
4.三次握手,四次挥手分别是什么
三次握手
首先客户端,服务端,TCP三次握手:
握手过程中使用了TCP的标志,SYN和ACK。
初始化状态:客户端处于close关闭状态,服务器处于Listen监听状态。
第一次握手:客户端发送请求报文将 SYN=1 同步序列号和初始化 seq=x发送给服务端,服务端从初始化状态,创建连接,等待客户端,确认接收后的状态为SYN_Receive。这个时候客户端处于等待状态为SYN_Send。
第二次握手,服务器接收到报文后(SYN=1,seq=x)收到请求后请求报文变为同步序列号SYN=1,初始化序列号seq=1,确认号ACK=1,ack=x+1,服务器为SYN_Receive状态,发送端的状态为:SYN_Send。
第三次握手,客户端收到服务端的数据包(收到响应后),然后发送同步序列号ack=y+1和数据包的序列号seq=x+1和ACK=1确认包作为应答(第三次握手:ACK=1,seq=x+1,ack=y+1),客户端和服务端变化为established状态。
四次挥手
第一次挥手
客户端设置seq和 ACK ,向服务器发送一个 FIN=1报文段。此时,(第一次挥手,FIN=1,seq=u)客户端进入 FIN_WAIT 状态,表示客户端没有数据要发送给服务端了。
第二次挥手
服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。
第三次挥手
服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态。
第四次挥手
客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT 状态。服务端收到客户端的 ACK 报文段以后,就关闭连接。此时,客户端等待 2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了。
到这基本已经凉了,我问不问点别的吗?
5.那做个this的指向题吧
var length = 10;
function fn() {
console.info(this.length)
}
fn(); // A 10
let Person = {
len: 5,
say: function() {
fn(); // B 10
arguments[0](); // C 1
}
}
Person.say(fn);
细细品尝,你品,