某跳動面試涼經

smart__yang發表於2020-12-02


以前也只是聽說大廠面試要手撕程式碼,今天確實親身體會了,接下來就奉獻出機會不多的經驗

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);

細細品嚐,你品,

相關文章