蒜頭君來蒜廠面試的時候,曾經遇到這樣乙個面試題:
給定 n
n 個整數,求裡面出現次數最多的數,如果有多個重複出現的數,求出值最大的乙個。當時可算是給蒜頭君難住了。現在蒜頭君來考考你。
第一行輸入乙個整數 n(1 \le n \le 100000)n(
1≤n≤
1000
00),接下來一行輸入 n
n 個 int 範圍內的整數。
輸出出現次數最多的數和出現的次數,中間用乙個空格隔開,如果有多個重複出現的數,輸出值最大的那個。
樣例輸入1
51 1 2 3 4
樣例輸出1
1 2
樣例輸入2
109 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...