查詢陣列中第二小的元素
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)
(**以後再整理啊啊啊啊啊)
合併2個排序好的陣列//法二
// 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;
}
方法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自...
關於快取你需要知道的
作後端開發的同學,快取是必備技能。這是你不需要花費太多的精力就能顯著提公升服務效能的靈丹妙藥。前提是你得知道如何使用它,這樣才能夠最大限度發揮它的功效,並抑制其 本文將介紹最如何正確的新增和更新快取。這部分將介紹在開始加快取之前我們必須要做的事情。這步非常重要,如果沒弄好,很有可能加了快取反而不如不...