藍橋杯 map的排序

2021-08-15 14:05:58 字數 1222 閱讀 7773

蒜頭君來蒜廠面試的時候,曾經遇到這樣乙個面試題:

給定 n

n 個整數,求裡面出現次數最多的數,如果有多個重複出現的數,求出值最大的乙個。當時可算是給蒜頭君難住了。現在蒜頭君來考考你。

第一行輸入乙個整數 n(1 \le n \le 100000)n(

1≤n≤

1000

00),接下來一行輸入 n

n 個 int 範圍內的整數。

輸出出現次數最多的數和出現的次數,中間用乙個空格隔開,如果有多個重複出現的數,輸出值最大的那個。

樣例輸入1

5

1 1 2 3 4

樣例輸出1

1 2

樣例輸入2

10

9 10 27 4 9 10 3 1 2 6

樣例輸出2

10 2

#include#include#includeusing namespace std;

bool cmp(pair&a,pair&b) //①自定義計算機的"小於"

int main()

vector>vec(m.begin(),m.end()); //③

sort(vec.begin(),vec.end(),cmp);

coutreturn 0;

}

學到的點:

①根據題意,我們想要使用sort函式,但預設的sort函式是「less」的(即從小到大排序),對於元組pair來說就是預設根據key值從小到大排序的。於是我們需要告訴計算機,計算機預設的「小於」應該是我認為的「大於」,見**。

②map計數的方法。

③一定要注意,

第一反應是利用stl中提供的sort演算法實現,這個想法是好的,不幸的是,sort演算法有個限制,利用sort演算法只能對序列容器進行排序,就是線性的(如vector,list,deque)。map也是乙個集合容器,它裡面儲存的元素是pair,但是它不是線性儲存的(前面提過,像紅黑樹),所以利用sort不能直接和map結合進行排序。

雖然不能直接用sort對map進行排序,那麼我們可不可以迂迴一下,把map中的元素放到序列容器(如vector)中,然後再對這些元素進行排序呢?這個想法看似是可行的。要對序列容器中的元素進行排序,也有個必要條件:就是容器中的元素必須是可比較的,也就是實現了《操作的。

兩個參考鏈結,寫得都讓我有所收穫:

藍橋杯 快速排序

快速排序 排序在各種場合經常被用到。快速排序是十分常用的高效率的演算法。其思想是 先選乙個 標尺 用它把整個佇列過一遍篩子,以保證 其左邊的元素都不大於它,其右邊的元素都不小於它。這樣,排序問題就被分割為兩個子區間。再分別對子區間排序就可以了。下面的 是一種實現,請分析並填寫劃線部分缺少的 incl...

藍橋杯 快速排序

以下 可以從陣列a中找出第k小的元素。它使用了類似快速排序中的分治演算法,期望時間複雜度是o n 的。請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。include int quick select int a,int l,int r,int k int i l,j r while i j while...

藍橋杯 快速排序

快速排序 排序在各種場合經常被用到。快速排序是十分常用的高效率的演算法。其思想是 先選乙個 標尺 用它把整個佇列過一遍篩子,以保證 其左邊的元素都不大於它,其右邊的元素都不小於它。這樣,排序問題就被分割為兩個子區間。再分別對子區間排序就可以了。下面的 是一種實現,請分析並填寫劃線部分缺少的 incl...