面試系列 你需要知道的8種資料結構

2021-10-06 02:46:47 字數 4748 閱讀 6622

查詢陣列中第二小的元素

1)初始化第一和第二個最小整數為int_max

first = second = int_max

2)遍歷所有元素。

a)如果當前元素小於first,則更新first

和second。

b)否則,如果當前元素小於second,則更新 second

#include

using

namespace std;

/* for int_max */

void

print2smallest

(int arr,

int arr_size)

first = second = int_max;

for(i =

0; i < arr_size ; i ++

)/* if arr[i] is in between first and second

then update second */

else

if(arr[i]

< second && arr[i]

!= first)

second = arr[i];}

if(second == int_max)

cout <<

"there is no second smallest element\n"

;else

cout <<

"the smallest element is "

<< first <<

" and second "

"smallest element is "

<< second << endl;

}int

main()

;int n =

sizeof

(arr)

/sizeof

(arr[0]

);print2smallest

(arr, n)

;return0;

}

查詢第乙個沒有重複的陣列元素

法一:使用兩個迴圈。外迴圈乙個接乙個地選擇元素,內迴圈檢查該元素是否多次出現。

法二:使用雜湊。

1)遍歷陣列和將元素及其計數到雜湊表中。

2)再次遍歷陣列,並列印計數等於1的第乙個元素。

時間複雜度: o(n)

輔助空間: o(n)

(**以後再整理啊啊啊啊啊)

//法二

// efficient cpp program to find first non-

// repeating element.

#include

using

namespace std;

intfirstnonrepeating

(int arr,

int n)

// driver code

intmain()

;int n =

sizeof

(arr)

/sizeof

(arr[0]

); cout <<

firstnonrepeating

(arr, n)

;return0;

}

合併2個排序好的陣列

方法1(o(n1 + n2)時間和o(n1 + n2)額外空間)

的想法是使用merge sort的 merge函式。

1、建立大小為n1 + n2的陣列arr3 ,同時遍歷arr1 和arr2 。

2、在arr1 和arr2 中選取較小的當前元素,將此較小的元素複製到arr3 中的下乙個位置,並在arr3 中向前移動,並選取其元素的陣列。

3、如果arr1 或arr2 中還有剩餘元素,請將它們也複製到arr3 中。

方法2(o(n1 * n2)時間和o(1)額外空間)

建立大小為n1 + n2的陣列arr3 。

將arr1 的所有n1個元素複製到arr3

遍歷arr2 和arr3 到arr1 的一對一插入元素(如插入排序)。此步驟需要o(n1 * n2)時間。

重新排列陣列中的正數和負數

陣列包含隨機數的正數和負數。重新排列陣列元素,以便交替放置正數和負數。正數和負數的數量不必相等。如果有更多正數,它們將出現在陣列的末尾。如果還有更多負數,它們也會出現在陣列的末尾。

例如,如果輸入陣列為[-1、2,-3、4、5、6,-7、8、9],則輸出應為[9,-7、8,-3、5,- 1,2,4,6]

解決方案是先使用quicksort的分割槽過程將正數和負數分開。在分割槽過程中,將0視為樞軸元素的值,以便將所有負數放在正數之前。一旦負數和正數分開,我們就從第乙個負數和第乙個正數開始,然後將每個備用負數與下乙個正數交換。

使用棧計算字尾表示式

1)建立乙個堆疊來儲存運算元(或值)。

2)掃瞄給定的表示式,然後對每個掃瞄的元素執行以下操作。

……a)如果元素是數字,則將其推入堆疊

……b)如果元素是運算子,則從堆疊中彈出該運算子的兩個運算元。計算結果符並將結果推回堆疊

3)表示式結束時,堆疊中的數字是最終答案

建立乙個臨時堆疊,例如tmpstack。

當輸入堆疊不為空時,請執行以下操作:

1、從輸入堆疊中彈出乙個稱為temp的元素

2、當臨時堆疊不為空並且臨時堆疊的頂部大於temp時,從臨時堆疊彈出並將其推入輸入堆疊

3、把temp放在臨時堆疊中

最後,排好序的數字在tmpstack中。

使用兩個佇列實現棧

佇列:先進先出;棧:後進先出

1、將x插入到佇列q1(假設q1的大小不受限制)。

彈出操作:

2、將第乙個元素(除了最後乙個元素從q1逐個出隊)排入q2。

3、使q1的最後一項出列,出列的結果為結果,將其儲存。

交換q1和q2的名稱

返回步驟2中儲存的專案。

反轉佇列的前k個元素:

(使用輔助棧和乙個新佇列)

需要使用乙個棧和乙個新佇列來實現反轉佇列前k個元素

1、從原始佇列中取出k個元素,分別壓入棧中

2、從棧中彈出所有元素逐個新增到乙個新佇列

3、把原始佇列中剩下的元素也新增到新佇列中

使用佇列將1到n轉換為二進位制:

1、建立乙個空字串佇列;

2、將『1』入隊,並用臨時字串s1儲存一下;

3、while(n–)

列印s1;

s1後追加0;

s2=s1

s2後追加1;

反轉鍊錶:

/*

反轉鍊錶,返回翻轉後的頭結點

*/pnode reverselist

(pnode phead)

return ppre;

}

遞迴:

/*

遞迴實現反轉鍊錶,返回翻轉後的頭結點

*/pnode reverselistrecursivly

(pnode ppre,pnode pcur)

pnode pnext = pcur-

>next;

pcur-

>next = ppre;

pnode pnewhead =

reverselistrecursivly

(pcur,pnext)

;return pnewhead;}

pnode reverselist2

(pnode phead)

檢查鍊錶中是否存在迴圈

floyd的迴圈查詢演算法:這是最快的方法,下面進行了介紹:

使用兩個指標遍歷鍊錶。

將乙個指標(slow_p)移動乙個,將另乙個指標(fast_p)移動兩個。

如果這倆指標在同一節點相遇,則存在迴圈。如果沒有相遇,則鏈結列表沒有迴圈。

刪除鍊錶中的重複元素結點圖的深度優先搜尋或dfs

演算法:1、建立乙個遞迴函式,該函式的引數為節點v和已訪問結點的陣列visited。

將當前節點標記為已訪問並列印該節點。

遍歷所有相鄰和未標記的節點,並使用相鄰節點的索引呼叫遞迴函式

檢查圖是否為樹

一棵樹必須具備如下特性:

(1)是乙個全連通圖(所有節點相通)

(2)無迴路(圖的邊數=節點數-1)

方法一:廣度優先搜尋。要判斷連通性,廣度優先搜尋法是乙個天然的選擇,時間複雜度o(n),空間複雜度o(n)。

方法二:深度優先搜尋,搜尋目標是遍歷全部節點。

給定一顆二叉搜尋樹,返回該二叉搜尋樹第k大的節點

思路:由於二叉搜尋樹的中序遍歷序列是從小到大的序列,模擬這一過程每訪問乙個節點,count++直到第k個。

二叉樹列印值為x結點的所有祖先

後序非遞迴遍歷二叉樹

利用後續非遞迴遍歷列印,並將出棧訪問結點的操作更改為了判斷出棧元素是否為要查詢的x。如果是,那麼就將棧內的元素全部出棧,如果不是則繼續進行後序遍歷

未完待續。。。

Sybase IQ,你需要知道的基礎

sybase iq,你需要知道的基礎 第一,知道iq跟其它的關係型資料庫相比,它的主要特徵是什麼?包括查詢快 資料壓縮比高 load快,但是插入更新慢,不太適合資料老是變化,它是按列儲存的。這時候你就知道它適做dss 決策支援系統 資料集市,資料倉儲,它不適合oltp。適合olap。第二,知道iq自...

Sybase IQ,你需要知道的基礎

sybase iq,你需要知道的基礎 第一,知道iq跟其它的關係型資料庫相比,它的主要特徵是什麼?包括查詢快 資料壓縮比高 load快,但是插入更新慢,不太適合資料老是變化,它是按列儲存的。這時候你就知道它適做dss 決策支援系統 資料集市,資料倉儲,它不適合oltp。適合olap。第二,知道iq自...

關於快取你需要知道的

作後端開發的同學,快取是必備技能。這是你不需要花費太多的精力就能顯著提公升服務效能的靈丹妙藥。前提是你得知道如何使用它,這樣才能夠最大限度發揮它的功效,並抑制其 本文將介紹最如何正確的新增和更新快取。這部分將介紹在開始加快取之前我們必須要做的事情。這步非常重要,如果沒弄好,很有可能加了快取反而不如不...