後臺面試彙總
作者:閃電⚡晨晨
連結:https://www.nowcoder.com/discuss/52422?type=2&order=0&pos=74&page=1
來源:牛客網
1、執行緒和程序的區別 程序: 併發執行的程式在執行過程中分配和管理資源的基本單位 程序的執行過程是線性的,程序的切換保護資源。 執行緒: 是CPU排程的基本單位 執行緒共享程序中的資源,執行緒的切換並不影響計算機軟硬體資源的分配。
2、中斷和異常的區別 中斷: 系統停止當前正在執行的程式而轉向其他服務 異常: 軟體執行過程中的一種開發過程中沒有考慮到的程式錯誤 也稱為同步中斷,在指令執行結束後發生的中斷
3虛擬記憶體和虛擬地址 虛擬記憶體: 程式使用的記憶體,利用外存來擴充記憶體,需要記憶體對映 虛擬地址: 由頁號和偏移量組成,位數與地址匯流排的位數相同
4、死鎖 必要條件: (1)互斥條件:一個資源每次只能被一個程序使用 (2)請求與保持條件:程序因請求資源而阻塞時,對獲得的資源保持不放 (3)不剝奪條件:已獲得資源,未使用完之前不能被剝奪 (4)迴圈等待條件:
解決方法: (1)死鎖預防:破壞死鎖產生的條件 (2)死鎖避免:每次申請之前判斷是否安全(銀行家演算法) (3)死鎖檢測:(超時法和等待圖法) (4)死鎖解除
5、行內函數和巨集定義 巨集定義: 預編譯階段 不做型別檢查 行內函數: 編譯階段 做型別檢查 短小函式 頻繁呼叫造成記憶體膨脹
6、資料庫索引 唯一索引 索引值唯一,但允許有空值 主鍵索引 特殊的唯一索引,但不允許有空值 普通索引 組合索引 多個屬性值構成的索引
7、聚集索引&非聚集索引 聚集索引 索引鍵值的邏輯順序決定了資料的物理儲存順序 葉子節點就是資料塊 非聚集索引 索引鍵值的邏輯順序與資料的物理順序可能不一致 葉子結點是指向對應資料塊的指標 B+樹&平衡二叉樹 B+數 所有關鍵字出現在葉子節點 非葉節點是索引,葉子節點是 儲存 更適合做檔案索引系統 查詢效能接近二分查詢樹
8、設計模式
1、簡單工廠模式:針對同樣的資料,不同的操作用同樣的介面。由工廠類建立不同的產品,不同的產品都是抽象類的繼承類。
2、工廠方法:針對同樣的資料,不同的操作使用不同的介面。
3、抽象工廠:針對不同的資料,不同的操作使用不同的介面。
9、10億個數找10個頻率最高的
1、利用hash方法把資料集分成幾個部分。
2、利用hash統計每一部分的詞頻。
3、利用堆排序求出每個資料集的前k個.
4、合併每個資料集的前k個。
10、1001裡兩個重複的數字 抑或
11、最大回文子串 動態規劃,記錄左邊迴文的最大右邊界
12、100層樓丟兩個雞蛋 不等式約束求最大值
13、三狼過河智力題 深度優先搜尋
14、斐波那契數列的變形 跑樓梯
15、二叉樹層次遍歷(如何只遍歷某一層) 佇列實現, 1
6、連結串列反轉 注意引數取值 17、二叉樹後序遍歷,遞迴和非遞迴
18、常用排序演算法的穩定性 快排,堆排,希爾排序不穩定,舉例子
19、為什麼靜態單例物件? 單例模式唯一的例項必須為靜態 不能建立物件,只能通過類中的介面來呼叫類中建立的物件。 使用類名直接呼叫類中的方法,所以類中的成員函式和資料成員必須是靜態的。
20、linux系統的特點 開放性,多使用者,多工,良好的介面,裝置獨立性:作業系統把所有的裝置統一當作檔案來處理,可靠的安全系統,良好的移植性:適應各種平臺,豐富的網路功能。
21、多程序和多執行緒 前者開銷大,後者開銷小(資料,資源角度),前者更加獨立。
22、多執行緒程式設計要點,如何保證執行緒間資料訪問的安全性 負載平衡,發揮每個核的作用。互斥和同步。
23、一棵有序的二叉樹中搜索到給定值 二叉排序樹
26、虛擬函式(作用及實現) 參考簡單工廠模式。
27、http協議(請求方式get和post的區別,不同的狀態碼,URL規格,404是什麼錯誤) get:請求讀取,post:請求新增資訊,1xx: 通知資訊,2xx:成功,3xx:重定向,4xx:客戶端出錯,5xx:伺服器出錯,<協議>://<主機域名>:<埠號>/<具體路徑>,not found
28、網頁的推薦是怎麼實現的(cookie,session是什麼?儲存在什麼位置,起什麼作用?) cookie記錄訪問網頁的情況。Cookie儲存在客戶端,session儲存在伺服器端。
29、10億個11位的號碼中找給定號碼是否存在 bool過濾器
30、linux系統中的常用命令 cd,gcc,ls(檔案列表),grep,cp(拷貝所有檔案),find,mv(移動檔案),rm(刪除),ps(檢視某一時刻程序的執行結果),tar(打包),time(測算一個命令的執行時間)
31、I/O多路複用(select,poll,epoll各自的原理,區別,如何使用) 通過一種機監視多個描述符,一旦就緒方可執行。Select: 每次呼叫,都需要把檔案描述符從使用者態拷貝進核心態;從核心態遍歷所有的檔案描述符;支援的檔案數量小。
32、專案中遇到的最大困難,如何解決,專案的最大成就
33、找出陣列中最大的連續和 動態規劃,當前最大值
34、三個協程按照順序輸出
package main import ( "sync/atomic" "time" "fmt" ) func main() { var number uint32 = 10 //count相當於一個接力棒 var count uint32 trigger := func(i uint32, fn func()) { //自旋鎖 for { if n := atomic.LoadUint32(&count); n == i { fn() //一定要在執行完函式後才原子加1 atomic.AddUint32(&count, 1) break } time.Sleep( 1 * time.Millisecond) } } for i := uint32(0); i < number; i++ { go func(i uint32) { fn := func() { fmt.Println(i) } trigger(i, fn) }(i) } trigger(number, func(){}) //會按照自然數順序列印(一定是這樣) }
35、hash表和B+樹的優勢 **資料庫索引** 1、唯一索引hash佔明顯優勢。2、範圍查詢B+樹佔明顯優勢。3、B+樹查詢速度不會有太大波動。
36、合併兩個有序連結串列
37、資料庫正規化 2NF:非主屬性完全函式依賴於碼。3NF:非主屬性不傳遞依賴於碼。BCNF: 任何函式以來都含有碼。
38、快速排序演算法(手寫) 遞迴&非遞迴
func quickSort(values []int,left,right int){ temp:=values[left] p:=left i,j:=left,right for i<=j{ for j>=p && values[j]>=temp{ j-- } if j>=p{ values[p]=values[j] p=j } for i<=p && values[i]<=temp{ i++ } if i<=p{ values[p]=values[i] p=i } } values[p]=temp if p-left>1{ quickSort(values,left,p-1) } if right-p>1{ quickSort(values,p+1,right) } } fund QuickSort(values []int){ quickSort(values,0,len(values)-1) }
39、單例模式中的多執行緒問題如何解決 懶漢模式:加同步鎖,雙重檢測鎖定、靜態內部類(類似惡漢模式)。
40、資料庫,左右連線,內連結 內連結:只有兩個表相匹配的行才在結果中出現。外連線:左外連線,右外連線,完整外部連線。
41、二叉樹的遍歷 前中後非遞迴
42、linux命令檢視CPU的使用情況 top
43、CPU load命令 程序對列的長度(CPU做多少工作)
44、資料庫事務的隔離級別 55
45、髒讀,幻讀,丟失修改 (讀完另一方RoLLBack)、(讀完對方已修改再讀)、(改完別人又改)
46、鎖的型別(排他鎖、共享鎖) 排他鎖(X鎖):只允許加鎖一方讀取和修改資料其它不能加任何型別的鎖。共享鎖(S鎖):加鎖一方和其它的只能讀,其它只能加S鎖。
47、字母字串排序,AaB 重新定義比較函式
48、字串找出不重複的字元組成的子串 hash表
49、訊息佇列 不懂
50、頁面置換演算法 FIFO,LRU,LFU(最不長使用)
51、抖動 剛被置換出的頁面馬上又被使用
52、缺頁中斷 頁表沒有,調入記憶體
53、條件概率 盒子有球問題
54、九宮格交換棋子
55、資料庫隔離級別
1、可讀取未確認:寫事務阻止寫事務,但未阻止讀事務(髒資料)。
2、可讀取確認:寫事務阻止讀寫事務,但讀事務不阻止其它事務(不可重複度)。
3、可重複讀:讀事務阻止寫事務,但不阻止其它事務(丟失修改)。
56、繩子覆蓋數軸上的點 兩個端點,小於前走,大於後走
57、2sum和ksum問題 hash方法或排序後左右夾逼,ksum通過遍歷轉化為2sum問題。
58、資料庫failover
59、AQS(如何管理執行緒,實現公平鎖和非公平鎖)
60、蓄水池問題
61、實現大數相乘 字串儲存,注意進位
62、作業系統磁碟的瞭解
物理結構:碟片、磁軌、扇區。
邏輯結構:引導控制塊(系統從該分割槽引導作業系統有關資訊),分割槽控制塊(分割槽的詳細資訊)。
排程演算法:FCFS、SSTF、SCAN、C-SCAN
63、linux shell
64、作業系統記憶體碎片
65、程式設計實現:1!+…+N!
66、sql查詢語句
68、分散式session三種實現方式和優缺點
69、重建二叉樹
70、二份查詢 左右邊界
71、字串全排列(時間複雜度) 遞迴演算法(按次序交換兩個字元的位置),O(n!)
72、陣列有正有負,移到兩邊 快速排序,中軸為0,swap(a[index++],a[i]);
73、判斷整數是否為2,4,8的冪次方 return x&(x-1)==0; return x&(x-1)==0&&x&0x55555555!=0; int i; for(i=0;n!=1;i++) n=n>>1; return x&(x-1)&&i%3==0;
74、旋轉有序陣列,找到其中的一個值(leetcode) 確定左邊有序還是右邊有序
75、nat協議 網路層協議:網路地址轉換,將本地IP地址轉換為全球IP地址,使專用網內部的主機與因特網上的主機通訊。
76、arp協議 資料鏈路層:地址解析協議(由IP地址獲得MAC地址),在本區域網內廣播發送請求,響應資料幀是單波傳送。(NAPT)
77、ip地址和mac地址的區別
ip地址:網路層地址,包含網路號和主機號,點分十進位制表示IPv4 32位,IPv6 128位。
mac地址:實體地址,介面卡地址,資料鏈路層的地址。
78、常見的單例模式
單例模式:某一實體類只需存在一個物件就可以滿足所有的業務需求。
1、其他類無法初始化該類的物件(建構函式為私有型別)。
2、該類可以在類中例項化一個唯一的自身物件(靜態物件)。
3、當前類可以向外界提供一個唯一的介面來提供例項,並返回一個該類的物件(靜態函式)。
惡漢模式: 例項在載入類時建立。執行緒安全(其他類不能修改例項)
懶漢模式: 其他類呼叫該類的獲取方法時建立例項。執行緒不安全(多個執行緒建立多個例項)
81、觀察者模式用法,實現
82、hash解決衝突的方法,如何保證多個hash函式不會出現死迴圈
83、如何破壞單例 反射機制和序列化機制
84、64G記憶體如何設定堆大小