2020校招筆試題答案及評分標准
滿分100分 時間1小時
一、簡答題:
- (5分)寫出你用過的linux命令,舉例說明其中幾個的具體用法。
答案:略。評分標准:正確五個,1分一個。
- (5分)寫出TCP的三次握手和四次握手的過程。
**三次握手:**
簡而言之:
1、客戶端向服務端發出連接請求,等待服務確認。
2、服務端收到請求,並發確認連接信息
3、客戶端收到服務端確認連接信息,建立連接。
**四次握手:**
簡而言之:
1、客戶端發出斷開連接請求
2、服務端收到請求,向客戶端發“收到斷開請求”的確認信息
3、服務端確認無數據發送后,向客戶端發出“關閉連接”
4、客戶端收到“關閉連接”,發送“斷開確認”,斷開TCP連接
三次握手詳細描述:
(1)第一次握手:客戶端將標志位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給服務端,客戶端進入SYN_SENT狀態,等待服務端確認。
(2)第二次握手:服務端收到數據包后由標志位SYN=1知道客戶端請求建立連接,服務端將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值
seq=K,並將該數據包發送給客戶端以確認連接請求,服務端進入SYN_RCVD狀態。
(3)第三次握手:客戶端收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,並將該數據包發送給服務端,
服務端檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,客戶端和服務端進入ESTABLISHED狀態,完成三次握手,隨后客戶端與服務端
之間可以開始傳輸數據了。
四次握手詳細描述:
由於TCP連接是全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務后,發送一個FIN來終止這一方向的連接,
收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。
首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。
(1)第一次揮手:客戶端發送一個FIN,用來關閉客戶端到服務端的數據傳送,客戶端進入FIN_WAIT_1狀態。
(2)第二次揮手:服務端收到FIN后,發送一個ACK給客戶端,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),服務端進入
CLOSE_WAIT狀態。
(3)第三次揮手:服務端發送一個FIN,用來關閉服務端到客戶端的數據傳送,服務端進入LAST_ACK狀態。
(4)第四次揮手:客戶端收到FIN后,客戶端進入TIME_WAIT狀態,接着發送一個ACK給服務端,確認序號為收到序號+1,服務端進入CLOSED
狀態,完成四次揮手。
- (10分)編寫程序將一個句子按單詞反序。比如“the sky is blue”,反序后變為“blue is sky the”?
思路:1、寫一個字符串翻轉函數,先對整個字符串翻轉,然后將它以空格切分為字符數組,再對每一個字符串翻轉。
2、切分成字符串數組,全部壓棧,然后出棧即可
- (10分)一張學生成績表score,部分內容如下:
name course grade
張三 操作系統 67
張三 數據結構 86
李四 軟件工程 89
用一條SQL 語句查詢出每門課都大於80 分的學生姓名。
Select distinct name from score where name not in(Select name from score where grade <= 80);
思路:首先查詢成績低於80分以下的人,然后只要是姓名沒有在這80分以下的人里面,那么他的所有科目都是80分以上。distinct表示去除重復記錄。
5.(10分)接口和抽象類的區別是什么?
評分標准:寫出正確三個區別,每個3分,三個都正確10分。
接口和抽象類的區別:
1、 接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
2、 類可以實現很多個接口,但是只能繼承一個抽象類
3、 類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
4、 抽象類可以在不提供接口方法實現的情況下實現接口。
5、 Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
6、 Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
7、 接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的。
- (15分)集合類用過哪些,分別列舉出來,並指出它們各自使用了那些數據結構。
評分標准:寫出正確三個,每個5分
- (15分)Spring的IOC和AOP是什么?Spring有哪些優點,談談你對spring的理解。
IOC就是控制反轉,是指創建對象的控制權的轉移,以前創建對象的主動權和時機是由自己把控的,而現在這種權力轉移到Spring容器中
,並由容器根據配置文件去創建實例和管理各個實例之間的依賴關系,對象與對象之間松散耦合,也利於功能的復用。DI依賴注入,和控
制反轉是同一個概念的不同角度的描述,即 應用程序在運行時依賴IoC容器來動態注入對象需要的外部資源。
AOP,一般稱為面向切面,作為面向對象的一種補充,用於將那些與業務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取並封裝
為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),減少系統中的重復代碼,降低了模塊間的耦合度,同時提高了系統的可維
護性。可用於權限認證、日志、事務處理。
優點:
(1)spring屬於低侵入式設計,代碼的污染極低;
(2)spring的DI機制將對象之間的依賴關系交由框架處理,減低組件的耦合性;
(3)spring提供了AOP技術,支持將一些通用任務,如安全、事務、日志、權限等進行集中式管理,從而提供更好的復用。
(4)spring對於主流的應用框架提供了集成支持。
評分標准:三個問題,每個5分
二、 編程題:
1、(15分)實現一個棧,包含棧的基本操作(pop、push、top、size)。
送分題 評分標准:pop push top 每個4分,size3分。
2、(15分)給定一個無序數組arr,找到數組中未出現的最小正整數
例如arr = [-1, 2, -3, 4]。返回1
arr = [1, 2, 3, 4]。返回5
[要求]
時間復雜度盡可能的低。
一般思路1:因為題目找最小正整數,設置一個temp=1,然后遍歷數組,若出現與temp相同的則temp++,並且從頭開始遍歷,
遍歷結束還沒有出現.則temp就是要找的數字。
一般思路2:排序。
最優思路3:原地哈希,把數組中取值在1到n的數放到對應的位置,比如1放到0的位置,2放到1的位置,……n放到n-1的位置,
然后遍歷重置后的數組,若i下標位置不是i+1,則i+1就是那個最小的正整數,若1到n位置都對的上,說明最小的正整數是n+1。
參考代碼:
public static int minNumberdisappered (int[] arr) {
int n=arr.length;
//原地hash
for(int i=0;i<n;i++){
//i為下標, 主要是排1到n這個區間范圍內的數據,其他超出區間的值一概不管,被替換也沒關系
while(arr[i]>=1 && arr[i]<=n && arr[arr[i]-1]!=arr[i]){
swap(arr,arr[i]-1,i);
}
//當前數組值
for(int j=0;j<n;j++) System.out.print(arr[j]+" ");
}
//遍歷答案
for(int i=0;i<n;i++){
if(arr[i]!=i+1){
return i+1;
}
}
return n+1;
}
private static void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
總結:
很榮幸的作為本次校招的出題人和閱卷人之一,考慮到校招大學生的基礎水平,題目出的不是很難,但是包含面比較廣泛,包括了Linux、計算機網絡、Java字符串處理、SQL語言、Java基礎知識
、Spring框架、數據結構等。總體來說題目我個人而言還算是比較滿意,雖然難度都不高,但是從筆試結果來看,做的並不是很好,題目簡單但是也有區分度,想拿高分並不簡單,里面的大多數知識都是一個項目所必須的,希望校招的同學們多多加強知識面的廣度(筆試)和語言的深度(面試)。