1. 程式人生 > >招銀網路(軟開C++)面試整理

招銀網路(軟開C++)面試整理

收羅了招銀網路網上能收到的軟開C++方面的面經,整理出來,已經面試過了,主要分為資料庫,C/C++,作業系統,計算機網路等幾個方面,下面分享給大家。

資料庫

1.解釋一下事務 和 ACID 特性

事務:是併發控制的基本單位。所謂的事務是指邏輯上的一組操作,組成這組操作的各個功能,要麼全部成功,要麼全部都不成功。事務可以是一條SQL語句,一組SQL語句或者整個程式。事物的提出是為了解決併發情況下保持資料一致性問題。

start transaction 開啟事務

rollback 回滾事務

commit 提交事務

Atomicity 原子性

指事務是一個不可分割的操作單位,事務中的操作要麼全部成功,要麼全部不成功

Consistency 一致性

必須使資料庫從一個一致性狀態裝換到另一個一致性狀態

如轉賬前A+B為2000,A像B轉賬100,完成後,A和B總和仍然為2000元

Isolation 隔離性

多個使用者併發訪問資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作資料所影響

Durability 永續性

一個事務一旦被提交。對資料庫的改變就是永久性的,即使資料庫發生故障也不會造成影響

2.事務隔離性

不隔離帶來問題:

髒讀:讀取了另一個事務未提交的資料

不可重複讀:多次讀取同一行,多次讀取結果不同,讀取了另一個事務提交的資料

幻讀:其他事物插入了新記錄,導致前後讀取不一致、

隔離級別:

讀取未提交 READ UNCOMMITED   最低級別,無法解決問題

          讀取已提交 READ COMMITED    大多數資料庫預設級別   解決髒讀

          可重讀     REPEATABLE READ  Mysql預設級別    解決髒讀,不可重複讀

          可序列化   SERIALIZABLE      全部解決,但效率極低,一般不用 帶來超時和鎖競爭現象

3.索引作用及好處壞處分析

4.EXISTS 和 IN 的區別

IN先執行子查詢,將子查詢結果和主查詢表做笛卡爾積,在進行選擇符合條件的,查詢次數為兩個表記錄乘積。

而EXISTS先執行主查詢語句,然後根據每一條記錄進行子查詢語句判定,查詢次數為主查詢記錄數。

因此當子查詢表較大時,因使用EXISTS。而 子查詢表記錄比如只有100條時,寧願選擇in,因為in在記憶體裡遍歷比較 ,而EXISTS需要查詢資料庫,所消耗的效能更高,記憶體比較更快。

5.內連線,外連線和交叉連線

a.內連線:利用內連線可獲取兩表的公共部分的記錄

Select * from A JOIN B ON A.Aid=B.Bnameid 

select * from A,B where A.Aid=B.Bnameid

.外連線:外連線分為兩種,一種是左連線(Left JOIN)和右連線(Right JOIN)

 (1)左連線(Left JOIN):即圖3公共部分記錄集C+表A記錄集A1。

 語句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid 

(2)右連線(Right JOIN):即圖3公共部分記錄集C+表B記錄集B1。

語句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid 

c.交叉連線

  概念:不帶WHERE條件子句,它將會返回被連線的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積(例如:T_student和T_class,返回4*4=16條記錄),如果帶where,返回或顯示的是匹配的行數

d.全連線

概念:返回左表和右表中的所有行。當某行在另一表中沒有匹配行,則另一表中的列返回空值

6.SQL中的觸發器有什麼作用

觸發器的主要作用就是其能夠實現由主鍵和外來鍵所不能保證的複雜的參照完整性和資料的一致性。除此之外,觸發器還有其它許多不同的功能:

(1)強化約束(Enforce restriction)

(2)跟蹤變化(Auditing changes)

(3)級聯執行(Cascaded operation)。

(4)儲存過程的呼叫(Stored procedure invocation)。

7.檢視和表的區別

表與檢視很相似,都是可以包含相同型別的資料的二維結構,都有行,列,單元格,在select語句的from字句中,都可以將他們用作資料來源。

當需要區分表和檢視的時候,通常表被稱為基表或者資料表。

不同之處: 

a:表直接將資料儲存在磁碟上,檢視是將sql語句儲存到磁碟上 

b:檢視是建立在表的基礎上,表儲存資料庫中的資料,而檢視顯示已經在表中的資料的外觀 

c:表是靜態的,而檢視是動態的,意思是表中資料發生了改變,其建立在表基礎的檢視跟著改變 

d:通過檢視不能改變表中資料。 

e:刪除檢視,表不受影響,而刪除表,檢視不再起作用 

f:檢視本身沒有資料,只儲存了sql語句

總之:記住檢視只儲存了sql語句,沒有儲存資料,每次使用檢視時會去執行sql語句在它的基表中查詢資料,而表卻是實實在在的儲存著資料。可以將查詢語句儲存到檢視中,在每次需要資料的時候去執行查詢,也可以直接將查詢語句的結果儲存到一個表中,以後使用的時候不再查詢,前者沒有後者快,後者比前者需要更多的磁碟空間。

可以通過檢視來修改基表的資料,但是有很多限制。只支援單表修改

8.B+樹的節點分裂

C/C++

1.變數的4種不同儲存型別

棧區:區域性變數,形參臨時變數

堆區:由程式設計師自己申請 new malloc

全域性區:靜態變數和全域性變數

常量區:常量字串 等

2.怎麼定義一個常量指標

const int *a; 常量指標 ,指向值不可變

int * const a;指標常量 ,指向位置不可變

3.過載和重寫,重定義的區別

一、過載(overload)

指函式名相同,但是它的引數表列個數或順序,型別不同。但是不能靠返回型別來判斷。

(1)相同的範圍(在同一個作用域中) ;

(2)函式名字相同;

(3)引數不同;

(4)virtual 關鍵字可有可無。

(5)返回值可以不同;

二、重寫(也稱為覆蓋 override)

是指派生類重新定義基類的虛擬函式,特徵是:

(1)不在同一個作用域(分別位於派生類與基類) ;

(2)函式名字相同;

(3)引數相同;

(4)基類函式必須有 virtual 關鍵字,不能有 static 。

(5)返回值相同(或是協變),否則報錯;<—-協變這個概念我也是第一次才知道…

(6)重寫函式的訪問修飾符可以不同。儘管 virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的

三、重定義(也成隱藏)

(1)不在同一個作用域(分別位於派生類與基類) ;

(2)函式名字相同;

(3)返回值可以不同;

(4)引數不同。此時,不論有無 virtual 關鍵字,基類的函式將被隱藏(注意別與過載以及覆蓋混淆) 。

(5)引數相同,但是基類函式沒有 virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆) 。

Child c; 此時執行c裡的函式,父類函式被隱藏,自動執行子類裡的函式

Father *b = &c; 此時執行b裡的函式,覆蓋了的會執行c中的,而重定義的仍執行b中的;

4.結構體裡面有沒有建構函式和解構函式

可以有,和CALSS區別如下.

class這個關鍵字還用於定義模板參 數,就像“typename”。但關鍵字“struct”不用於定義模板引數。

class中預設繼承方式是private,而struct的預設繼承方式是public

class中預設成員訪問許可權是private,而struct的預設訪問許可權是public

5.拷貝建構函式為什麼要用引用

不然在呼叫拷貝建構函式時,建立形參臨時變數又會呼叫拷貝建構函式,會引起無限遞迴呼叫。

6.C語言中單向連結串列和雙向連結串列有什麼區別

單向連結串列,只能訪問當前節點的下一個節點。而雙向連結串列可以訪問下一個節點和前一個節點

單向迴圈連結串列,最後一個節點next指標為NULL,雙向迴圈連結串列,最後一個節點next指標為*phead,*phead的pre指標為最後一個節點。

7.跳躍表有沒有聽過

  跳躍表基於有序單鏈表,在連結串列的基礎上,每個結點不只包含一個指標,還可能包含多個指向後繼結點的指標,這樣就可以跳過一些不必要的結點,從而加快查詢、刪除等操作。 查詢,刪除,插入都是logn

8.java有記憶體回收的機制,C沒有,什麼時候出現野指標,什麼時候出現記憶體洩漏

野指標:定義的指標沒有及時初始化。delete指標之後,沒有及時置為NULL 。指標超過了變數的作用範圍。

9.new和malloc的區別

malloc是標準庫函式,支援覆蓋。new是運算子,支援過載

malloc和free僅僅分配和回收空間,而new和delete除了分配回收空間,還會呼叫建構函式和解構函式

malloc返回的是void型別指標,必須進行型別轉換。new返回的是具體型別指標

10.靜態成員函式為什麼不能宣告為虛擬函式

static成員不屬於任何類物件或類例項,所以即使給此函式加上virutal也是沒有任何意義的。

靜態與非靜態成員函式之間有一個主要的區別。那就是靜態成員函式沒有this指標。

ps:,靜態成員函式也不能被宣告為const和volatile. 而static成員函式沒有this指標,所以使用const來修飾static成員函式沒有任何意義。  volatile的道理也是如此。

資料結構與演算法

1.各演算法複雜度

最壞情況下複雜度最小的排序演算法 堆排序

陣列基本有序 插入排序

插排 時間複雜度與比較次數,移動次數都與初始序列有關

快排 時間複雜度與比較次數,與移動次數都與初始序列有關

歸排 時間複雜度與初始序列無關,比較次數有關(有序序列),移動次數無關(無論怎麼有序,還是每個元素拷貝到新的陣列)

選排 時間複雜度與初始序列無關,比較次數無關,移動次數無關

冒排 時間複雜度與初始序列無關,比較次數無關,移動次數有關

2.如何實現環形佇列/連結串列

環形佇列:兩個指標指向入口,插入一個數後,尾指標進行移動,頭指標不動,刪除一個數時,頭指標向前移即可。注意插入數時,m_tail = m_tail % queue_capacity

環形連結串列:使用尾插法建立單鏈表,插入完最後一個數之後,該節點的next指標不指向NULL,而指向*phead。

3.二叉樹的遍歷有哪幾種

前序 根左右

中序 左根右

後序 左右根 遞迴和非遞迴都可實現,程式碼熟悉

層序 使用一個棧來實現,從根節點開始遍歷,左右節點入棧,然後訪問左子節點,列印,同時左子節點的左右節點再次入棧,一直到棧為空,由此可以實現層序遍歷。

程式設計題

1.尋找字串

BF或者KMP演算法

2.單鏈表反轉 複雜度為n

直接標定3個節點,然後對每個節點進行反轉,而不會丟失無法訪問下個節點

{

}

}

3.新舊密碼判定

輸入三個字串 舊密碼,新密碼,新密碼確認 ,舊密碼不能和新密碼相同,新密碼2次要一樣,且不能是123456或者666666這種簡單密碼

作業系統:

1.程序和執行緒

程序:資源分配的基本單位,程序可以併發執行。

執行緒:獨立排程的基本單位,一個程序中可以有多個執行緒,他們共享程序資源

區別:

a.擁有資源 程序是資源分配基本單位。執行緒不擁有資源,可以訪問隸屬程序的資源

b.排程 執行緒是獨立排程的基本單位,在統一程序中,執行緒的切換不會引起程序切換,從一個程序內的執行緒切換到另一個進度中的執行緒會引起程序切換

c.系統開銷 建立和撤銷程序的開銷遠大於執行緒。程序切換會涉及CPU環境報錯和新排程程序CPU環境設定,而執行緒切換隻需儲存和設定少量暫存器內容,開銷很小

d.通訊方面 程序間通訊需要程序同步和互斥手段以保證資料一致性,而執行緒間直接通過讀寫同一程序中的資料段來進行通訊

2.程序通訊方式

a.管道 只針對父子程序,半雙工

b.FIFO 去掉了父子程序限制 常用於客戶-伺服器應用程式中

c.訊息佇列 比FIFO更好

d,訊號量

e.共享儲存 最快的一種程序通訊

f.套接字 解決不同機器間程序通訊

3.什麼是死鎖,必要條件,解決方法

死鎖,是指多個程序在執行過程中因為爭奪資源而造成的的一種僵局,造成他們都無法向前推進

必要條件:a.互斥條件 一段時間內某資源被一個程序佔用,此時其他請求者只能等待

b.請求和保持條件 程序已經保持了至少一個資源,但又提出新的資源請求,而請求的資源被其他程序佔有,此時請求程序阻塞,又不會釋放自己已經佔用的資源

c.不可剝奪條件 程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用時由自己釋放

d。環路等待條件 請求資源形成資源環形鏈,即P0等待P1,p1等待p2,。。。pn等待p0;

解決辦法。a.預防死鎖 破壞必要條件預防發生死鎖

b.避免死鎖

c.檢測死鎖

d.解除死鎖

4.sleep和wait的區別

sleep() 方法是執行緒類(Thread)的靜態方法,讓呼叫執行緒進入睡眠狀態,讓出執行機會給其他執行緒,等到休眠時間結束後,執行緒進入就緒狀態和其他執行緒一起競爭cpu的執行時間。 因為sleep() 是static靜態的方法,他不能改變物件的機鎖,當一個synchronized塊中呼叫了sleep() 方法,執行緒雖然進入休眠,但是物件的機鎖沒有被釋放,其他執行緒依然無法訪問這個物件。

wait()是Object類的方法,當一個執行緒執行到wait方法時,它就進入到一個和該物件相關的等待池,同時釋放物件的機鎖,使得其他執行緒能夠訪問,可以通過notify,notifyAll方法來喚醒等待的執行緒

sleep() 和 wait() 的區別就是 呼叫sleep方法的執行緒不會釋放物件鎖,而呼叫wait() 方法會釋放物件鎖

計算機網路

1.路由層協議除了ip協議還有哪些協議

ICMP

IGMP

2.arp協議有什麼作用,具體的協議處理過程? 

由IP地址得到MAC實體地址

3.TCP/IP四層,幾個協議分別屬於哪層

HTTP DNS 等應用層

TCP UDP 運輸層

IP ICMP IGMP RAP RARP 網際層

網路介面層

4.TCP重傳機制

5.DNS原理

其他

1.瀑布模型幾個階段

2.動態連結庫和靜態連結庫

3.說10個程式設計的好習慣

4.簡要描述一個客戶端伺服器通訊的步驟 Socket