1. 程式人生 > >後臺面試彙總

後臺面試彙總

作者:閃電⚡晨晨
連結: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記憶體如何設定堆大小