今日頭條面試題+答案,花點時間看看!

閱讀本文大概需要 6 分鐘。

來源:公衆號業餘草

首先看問題(答案見後面)

1、變量a是一個64位有符號的整數,初始值用16進製表示爲:0x7FFFFFFFFFFFFFFF;變量b是一個64位有符號的整數,初始值用16進製表示爲:0x8000000000000000。則a+b的結果用10進製表示爲多少?

A.1
B.-1
C.263+262+…+22+21+2^0
D.–(263+262+…+22+21+2^0)

2、TCP建立連接的三次握手中,第二次握手發送的包會包含的標記,最正確的描述是?

A.ACK
B.SYN,ACK
C.SYN,PSH
D.SYN

3、棧是先進後出的數據結構。給定一個大小爲3的初始狀態爲空的棧,已知一組數據經過這個棧後,最終的數據順序依次爲:1 3 2 4 ,問原始的進棧數據不可能是以下的那組?

A.2 3 1 4
B.1 4 2 3
C.4 2 3 1
D.3 1 2 4

4、電路中其中三個門電路非門,與門,或門的示意圖及性質分別如下所示:
非門,使輸入的電平編程相反電平:
 
與門,使輸入兩個高電平,輸出高電平,其他情況下輸出低電平:
 
或門。當且僅當輸入兩個低電平時,輸出低電平,否則輸出高電平:
 
現在對以下的電路中的 A 和 B 引腳分別持續輸入一個高電平( 1 )和一個低電平( 0 ),問最終電路的引腳 C 、 D 、 E 、 F 分別輸出的電平是什麼?
 
A.C=0,D=1,E=0,F=1
B.C=1,D=1,E=1,F=0
C.C=1,D=1,E=0,F=1
D.C=0,D=0,E=0,F=1

5、操作系統中可以使用LRU(least recently used)內存淘汰舊數據的策略,如果內存需要加載新數據但空間又不足,則會按照最近訪問時間進行排序,並將最老的數據淘汰,假設現在內存空間大小爲5,原本內存中沒有數據,對內存中數據的訪問順序如下:1,2,5,3,4,6,1,4,3,6,7,8,3,9

A.缺頁次數:9
B.缺頁次數:4
C.缺頁次數:10
D.缺頁次數:5

6、下面的程序中, int32-t 表示一個有符號的 32 位整數,程序的入口是 main 函數,問最終 res 的結果是多少?
 
A.–(231+230+…+22+21+2^0)
B.0
C.-1
D.程序會死循環

7、給定一個如下所示的圖,圖中的邊代表了兩個節點間的距離。如果使用迪傑斯特拉算法對節點 1 和節點 8 求最短路徑,則當完成計算時,算得節點1 到節點 8 的最短路徑是?同時當完成節點 1 到節點 8 的最短路徑計算時,節點 1 到哪些節點(除了 1 和 8 )的最短路徑也已經計算完畢?( )

 

8、x86 CPU在實模式下解釋代碼時看到一個地址爲2330H:5041H,請問它最終在內存中要找的地址是多少?

A.28341H
B.5374H
C.52740H
D.7371H

9、有三個程序J1,J2,J3。程序在單核CPU執行時,三個程序需要的資源如下所示:
 
優先級高的程序可以搶佔優先級低的程序的CPU,但不能搶佔IO。問當所有任務執行完畢時,共消耗的時間是?

A.170ms
B.160ms
C.120ms
D.130ms

10、給定整數m以及n各數字A1,A2,…An,將數列A中所有元素兩兩異或,共能得到n(n-1)/2個結果,請求出這些結果中大於m的有多少個。

答案僅供參考

1、答案解析:正確答案: B  
(1)a+b的16進製表示爲:OxFFFFFFFFFFFFFFF(16位F),轉爲2進製爲111……111(64位1,每個F->4位2)。
(2)有符號數:是針對二進制來講的。用最高位作爲符號位,「0」代表「+」,「1」代表「-」。所以a+b的結果是一個負數。
(3)計算機中負數是以補碼的形式保存的,將補碼轉換成原碼的計算方式如下:
        ①. 對於正數,原碼與補碼相同。
        ②.對於負數,將補碼除符號位之外,按位取反,末位加1,即得到原碼。
(4)a + b = 111……111(64位1)
          取反:100……000(1位1,後面63位0)
          加一:100……00(中間62位0)
      10進制:-1。

2、答案解析:正確答案: B
附上tcp建立連接的三次握手過程圖(第二次握手包含的標記是SYN,ACK),所以選B:
 

3、答案解析:正確答案: C
注意棧的大小爲3

4、答案解析:正確答案: D

5、答案解析:正確答案: C  
內存空間5,所以前5個都是缺頁的,因爲內存空間中並沒有這五個,然後6置換1,1置換2,然後4.3.6都有不用置換,7置換5,8置換4,3有了,然後9置換3,總共十次。

6、答案解析:正確答案: D
以char爲例
f(1,0): 
        a=2  b=-1 
        a=3  b=-2 
        … 
        a=127 b=-126 
        a=128 b=-127  溢出–>a=-128 b=-127     char範圍:-128~127        
 return a+b:-128-127實際上是1(char範圍),繼續循環

而原例爲int_32t,臨界情況 a+b:      -232+(-232+1)=1,也繼續循環。

因此死循環。

7、答案解析:正確答案: C
初始狀態:路徑長度0:(1)
路徑長度1:(1,5)
路徑長度2:(1,3)
路徑長度3:(1,3,4),(1,2)
路徑長度4:(1,5,8)
節點1到8的最短路徑長度爲4;    2,3,4,5節點的最短路徑已經計算完畢;  其中到5節點的最短路徑最小爲1;
應該選C,感覺出題人玩文字遊戲把自己繞進去了

8、答案解析:正確答案: A
實模式下內存空間的訪問
8086處理器(CPU)內的寄存器都是16位的,地址線上的地址由CPU提供。CPU用兩個16位的值合成一個20位的值:將一個16位的值乘以16(相當於這個16位的值保存在20位寄存器的低16位中,然後將低16位往高位移動了4位)再加上另一個16位的值。將這個由2個16位合成的值提供給20根地址線作爲訪問內存的地址值。被乘以16的那個值被稱爲段基址,沒有被乘以16的那個值被稱爲偏移地址。

CPU在實模式下,段寄存器中的值就是段基址,如果想要通過彙編程序訪問某個內存單元,那麼就需要指定一個段寄存器和一個偏移地址或以「段基址值:偏移地址值」的格式。CPU會將段寄存器的值乘以16再與偏移地址相加後,纔將這個結果提供給地址線;用段基址和偏移地址的形式給出的表達式,CPU也會給段基址乘以16與偏移地址相加後,纔將這個結果提供給地址線。

Figure 2. 實模式下訪問內存(得出內存地址)的方式
這就是說,在彙編程序中,得用段基址:偏移地址的方式訪問內存,因爲CPU形成內存地址的方式是「段基址* 16 + 偏移地址」。
按照「段:偏移地址」的方式訪問內存是CPU對內存的一種管理方式

9、答案解析:正確答案: D
因爲優先級高的程序可以搶佔優先級低的程序的CPU,但不能搶佔IO,
所以J1在CPU之後不能搶佔J2的IO,J2在IO之後可以搶佔J3的CPU。

CPU:J1 40ms + J3 10ms + J2 20ms +J1 20ms
IO:J2 50ms + J1 60ms + J3 20ms

所以共消耗時間爲130ms,選D。

10、答案解析:
直接計算肯定是超時的,所以這問題不能使用暴力**,考慮到從高位到地位,依次進行位運算,如果兩個數異或結果在某高位爲1,而m的對應位爲0,則肯定任何這兩位異或結果爲1的都會比m大。

由此,考慮使用字典樹(TrieTree)從高位到第位建立字典,再使用每個元素依次去字典中查對應高位異或爲1, 而m爲0的數的個數,相加在除以2既是最終的結果;直接貼出代碼如下,非原創,歡迎討論;

補充:queryTrieTree在搜索的過程中,是從高位往低位搜索,那麼,如果有一個數與字典中的數異或結果的第k位大於m的第k位,那麼該數與對應分支中所有的數異或結果都會大於m, 否則,就要搜索在第k位異或相等的情況下,更低位的異或結果。queryTrieTree中四個分支的作用分別如下:

  1. aDigit=1, mDigit=1時,字典中第k位爲0,異或結果爲1,需要繼續搜索更低位,第k位爲1,異或結果爲0,小於mDigit,不用理會;

  2. aDigit=0, mDigit=1時,字典中第k位爲1,異或結果爲1,需要繼續搜索更低位,第k位爲0,異或結果爲0,小於mDigit,不用理會;

  3. aDigit=1, mDigit=0時,字典中第k位爲0,異或結果爲1,與對應分支所有數異或,結果都會大於m,第k位爲1,異或結果爲0,遞歸獲得結果;

  4. aDigit=0, mDigit=0時,字典中第k位爲1,異或結果爲1,與對應分支所有數異或,結果都會大於m,第k位爲0,異或結果爲0,遞歸獲得結果;


後臺回覆「加羣」,帶你進入高手如雲交流羣

推薦閱讀:

自動刷淘寶喵幣!拿紅包都靠這牛逼的腳本...

百度的Java面試題庫,都有什麼呢?

緊張的337小時,終於等來了字節跳動offer

分享14個實用的數據庫設計技巧

MySQL的優化實戰,必須收藏了!


10T 技術資源大放送!包括但不限於:雲計算、虛擬化、微服務、大數據、網絡、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公衆號內回覆「1024」,即可免費獲取!!