今日頭條C++後臺開發實習面試總結
一. 旋轉陣列中尋找某個target,leetcode原題。
二. 一個數組建立堆。
堆排序中,最初的步驟就是建立一個堆。之前在一些公司的筆試題上面見到一些與建堆過程相關的題目,因為當時對建堆過程有個誤解,所以經常選錯。之前一直以為是在完全二叉樹中依次插入序列中的元素,每插入一個元素,就呼叫siftup操作;而實際的建堆操作是序列中元素首先就全部填入一個完全二叉樹,然後從第一個非終端節點開始,呼叫siftdown操作,依次調整。
以下是一篇關於建堆過程的文章,轉載自:http://www.cnblogs.com/zabery/archive/2011/07/26/2117103.html
堆排序過程
堆分為大根堆和小根堆,是完全二叉樹
既然是堆排序,自然需要先建立一個堆,而建堆的核心內容是調整堆,使二叉樹滿足堆的定義(每個節點的值都不大於其父節點的值)。調堆的過程應該從最後一個非葉子節點開始,假設有陣列A = {1, 3, 4, 5, 7, 2, 6, 8, 0}。那麼調堆的過程如下圖,陣列下標從0開始,A[3] = 5開始。分別與左孩子和右孩子比較大小,如果A[3]最大,則不用調整,否則和孩子中的值最大的一個交換位置,在圖1中是A[7] > A[3] > A[8],所以A[3]與A[7]對換,從圖1.1轉到圖1.2。
以上便是建堆的完整過程,主要總結有以下幾點需要注意:
1.首先將所有元素按照初始順序填充到一個完全二叉樹中
2.從“最後一個非終端節點”開始,呼叫siftdown方法,調整堆的結構,直到根節點為止
三. TCP/IP close_wait狀態和time_wait狀態。
TIME_WAIT 表示主動關閉,CLOSE_WAIT 表示被動關閉。
CLOSE_WAIT狀態的生成原因
首先我們知道,如果我們的伺服器程式APACHE處於CLOSE_WAIT狀態的話,說明套接字是被動關閉的!
因為如果是CLIENT端主動斷掉當前連線的話,那麼雙方關閉這個TCP連線共需要四個packet:
Client ---> FIN ---> Server
Client <--- ACK <--- Server
這時候Client端處於FIN_WAIT_2狀態;而Server 程式處於CLOSE_WAIT狀態。
Client <--- FIN <--- Server
這時Server 傳送FIN給Client,Server 就置為LAST_ACK狀態。
Client ---> ACK ---> Server
Client迴應了ACK,那麼Server 的套接字才會真正置為CLOSED狀態。
Server 程式處於CLOSE_WAIT狀態,而不是LAST_ACK狀態,說明還沒有發FIN給Client,那麼可能是在關閉連線之前還有許多資料要傳送或者其他事要做,導致沒有發這個FIN packet。
四.
nginx的程序模型。
五. redis的記憶體分配。
六.MySQL 引擎 Innodb 聚簇索引與非聚簇索引,B+樹與B樹的區別。