面經總結(初戰)

2022-06-09 08:33:11 字數 3423 閱讀 9326

今天進行了一場面試,崗位是位元組跳動後端開發,發現對跨考真難,劍指才刷了三分之一,動態規劃題目不會做,害,最終結果沒通過,也是第一次面試,自己各個方面都存在問題。

且先當一次查漏補缺吧

計算機網路相關:tcp如何確保資訊收到?

當時沒記起來,應該是超時重發,發過一次資料報後,待伺服器端確認無誤,傳送ack,客戶端收到後,再發下乙個包,每發乙個包,客戶端就會進行計時,超出時間會進行重發

1.校驗和:傳送的資料報的二進位制相加然後取反,目的是檢測資料在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,tcp將丟棄這個報文段和不確認收到此報文段。 

2. 確認應答+序列號(累計確認+seq):接收方收到報文就會確認(累積確認:對所有按序接收的資料的確認)。tcp給傳送的每乙個包進行編號,接收方對資料報進行排序,把有序資料傳送給應用層。 

4.超時重傳:當tcp發出乙個段後,它啟動乙個定時器等待目的端確認收到這個報文段如果不能及時收到乙個確認,將重發這個報文段。 

3. 流量控制:tcp連線的每一方都有固定大小的緩衝空間,tcp的接收端只允許傳送端傳送接收端緩衝區能接納的資料。當接收方來不及處理傳送方的資料,能告知傳送方降低傳送的速率,防止包丟失。tcp使用的流量控制協議是可變大小的滑動視窗協議。接收方有即時視窗(滑動視窗),隨ack報文傳送。如果接收到視窗大小的值為0,那麼傳送方將停止傳送資料。並定期的向接收端傳送視窗探測資料段,讓接收端把視窗大小告訴傳送端。

4.擁塞控制:如果網路出現擁塞,分組將會丟失,此時傳送方會繼續重傳,從而導致網路擁塞程度更高。因此當出現擁塞時,應當控制傳送方的速率。這一點和流量控制很像,但是出發點不同。流量控制是為了讓接收方能來得及接收,而擁塞控制是為了降低整個網路的擁塞程度。

作業系統:如何區分核心態和使用者態?

cpu狀態:

核心態(kernel mode):執行作業系統程式,操作硬體

使用者態(user mode):執行使用者程式

特權環:r0、r1、r2和r3

r0相當於核心態,r3相當於使用者態;

不同級別能夠執行不同的指令集合;

使用者態--->核心態:唯一途徑是通過中斷、異常、陷入機制(訪管指令)

核心態--->使用者態:設定程式狀態字psw

區別:狀態切換的發生方式

這是使用者態程序主動要求切換到核心態的一種方式使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作。比如前例中fork()實際上就是執行了乙個建立新程序的系統呼叫。

而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的乙個中斷來實現,例如linux的int 80h中斷。

使用者程式通常呼叫庫函式,由庫函式再呼叫系統呼叫,因此有的庫函式會使使用者程式進入核心態(只要庫函式中某處呼叫了系統呼叫),有的則不會。

當cpu在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。

當外圍裝置完成使用者請求的操作後,會向cpu發出相應的中斷訊號,這時cpu會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,

如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。

這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的。

面試官還想問檔案系統相關問題,我好像沒學過,太難了,回頭認真複習一波,加油!

1、以陣列序號為天數,值為****,如何買賣,利潤最大,輸出**天數,和賣出天數,以及利潤。

這個題目倒是做出來了

2、求數列最大子數列和問題,要求返回最大子數列起止和最大和。

問題描述:乙個整型陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。注意:當全是負數的情況時,返回最大的那個負數

這個問題最開始想的是暴力破解,跟面試官交流後,發現不能使用暴力破解法,這個問題是乙個動態規劃問題。

從左到右掃瞄陣列,在掃瞄過程中,記錄陣列的負數的個數和掃瞄過中資料中的最大值,並累加每個掃瞄到的資料的和,假設用變數thissum(初值為0)儲存,如果當前的累加值大於之前的累加值的最大值 (例如用變數sum記錄,初值為0),則把當前的最大值儲存為最大值(sum = thissum),如果thissum小於0,則把thissum設定為0並重新進行累加。一直這樣掃瞄陣列,直到把陣列掃瞄完。由於thissum已經小於0,也就是說之前統計的和可以捨棄,因為把當前的元素累加之後,結果反而小了。例如把陣列分成三部分aib,因為a的值大於0,a+i的值小於0,所以如果從b開始從新累加,則其值一定比包括i然後去累加b的結果大,因為i小於0,而b中的和卻不一定比在a之前累加的和大。由於如果陣列全是負數時,要返回最大的負數,而從上面所說的說法中,我們可以看到當前累加總和(thissum)總是與0進行比較,如果小於0則把thissum置為0,所以當陣列全是負數時,thissum和陣列的最大子串行之和(sum)總是為0,而與現實有點不一樣,所以就要記錄負數的數量,當負數的數量等於元素的個數(即全是負數)時,就要把最大連續子串行和置為最大的負數。這也是前面所說的,在掃瞄過程中記錄負數的個數和最大元素的作用。

code:

int maxsum(int* a,int n)

else if(thissum < 0)

}//若全是負數,最大值為陣列中的最大無素

if(flag == n)

sum = maxnum;

return sum;

}

該演算法的時間複雜度只為o(n),而且常數為1,即只需要掃瞄一次陣列即可完成任務。而且用到的輔助空間也非常少,只有四個變數,空間複雜度為o(1)。

今天總結一波:

面試準備的都沒考,基礎還是不牢固,劍指還得刷,自己刷的題目太少了,另外作業系統和計算機網路的知識也有很多遺忘。

選擇後端開發,也是目前沒辦法的事,cv和推薦系統感覺要學的太多了,而且很多時候導師也不會幫忙,話說導師的研究方向跟cv方向還是有點差距。自己並不是很感興趣。

前路漫漫,吾將上下而求索。

hldc面經總結

1.int32 a 1 設定bit3 2 清除bit3 3 獲取a的高八位的值和低八位的值 4 將資料存入高八位 解答 define bit3 0x1 3 static int a void set bit3 void void clear bit3 void include include cha...

網易面經總結

1.執行緒池的threadpoolexecutor的主要引數有哪些,詳細介紹了一下任務佇列 2.執行緒建立的幾種方式以及區別 3.hashmap的底層實現,以及1.7和1.8之間的區別 4.執行緒安全的容器有哪些 5.concurrenthashmap的底層實現原理,以及1.8是如何操作的 6.異常...

面經 葫蘆面經

1 給定乙個n位數,例如12345,從裡面去掉k個數字,得到乙個n k位的數,例如去掉2,4,得到135,去掉1,5,得到234。設計演算法,求出所有得到的 n k位數裡面最小的那乙個 2 找明星 n個人中,只有乙個明星 明星不認識其他所有的人,而其他人 都認識明星,這些人中也可能相互認識。你每次只...