統計數字


Description

某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*10^9)。已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。

Input

每組輸入數據包含n+1行
第一行是整數n,表示自然數的個數
第2~n+1行,每行一個自然數。
1<=n<=200000,每個數均不超過1500000000(1.5*10^9)

Output

每組輸出包含m行(m為n個自然數中不相同數的個數),按照自然數從小到大的順序輸出。每行輸出兩個整數,分別是自然數和該數出現的次數,其間用一個空格隔開。

Sample Input 1

8
2
4
2
4
5
100
2
100

Sample Output 1

2 3
4 2
5 1
100 2

解題思路:

(1)這道題只需將重復的數字記錄下來,但是不能單純的用一個int 數組記錄,因為題目給數字最大可到達1500000000(1.5*10^9),所以數組會爆掉,沒辦法存那么大的數字,所以此題用一個map數組存,(map數組的底層是紅黑樹,具體可自己去了解知識)

(2)題目給的時間是2s    ,下面代碼時間復雜度是n*logn;題目n最大200000,再乘以log200000,不超過題目給的時間,不會超時

(3)注意輸出結果是從小到大輸出,所以sort;

 

代碼如下:

 1 #include<iostream>
 2 #include<map>
 3 #include<algorithm>
 4 using namespace std;
 5  
 6 map<int,int>mp;//用一個map數組記錄,且不用將mp初始化為0,因為系統自動初始化為0;注意要頭文件map
 7 map<int,int>vis;//用來記錄
 8 int n ;
 9 long long int a[200005];
10 int main()
11 {
12     cin>>n; 
13    
14     for(int i = 1 ; i <= n ;i++)
15     {
16          cin>>a[i];
17          mp[a[i]]++; //將重復的數字記錄下來,計算一下相同的a[i]有幾個;
18     }
19 
20     sort(a,a+n);  //排序,注意要頭文件  algorithm
21     for(int i = 1;i <= n;i++)
22     {
23         if(mp[a[i]]!=0&&vis[a[i]]==0)   //如果mp[a[i]]!=0,且a[i]不相同,沒被訪問過
24         {
25             cout<<a[i]<<" "<<mp[a[i]];
26             cout<<endl;
27             vis[a[i]]=1;  //將輸出的a[i]記錄下來,記錄它已訪問過了;
28         }
29     }
30 
31     return 0; 
32 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM