题目描述
某次科研调查时得到了nn个自然数,每个数均不超过1500000000(1.5×10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入格式
共n+1行。
第一行是整数n,表示自然数的个数;
第2至n+1每行一个自然数。
输出格式
共m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。
每行输出2个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
输入输出样例
输入输出样例
输入 #1
8 2 4 2 4 5 100 2 100
输出 #1
2 3 4 2 5 1 100 2
这道题,大家比较容易用到的可能是STL的set、map等,我这里是另一种方法。
我们可以开两个数组,一个用来存放输入的数,另一个存放数出现的次数。
首先将自然数全部从小到大排序,这时相同的数,是排在一起的。例如样例中排完序后为:
2 2 2 4 4 5 100 100
接下来用另一个数组x记录下数出现的次数,(这一步骤在排完序后就变得很简单了):
从第一个数开始,如果第i个数与第i-1个数不相等,那么该数出现的次数为1,x[i] = 1,
如果第i个数与第i-1个数相等,则这个数出现的次数为前一个数出现的次数加1,有x[i] = x[i-1]+1
#include <iostream>
#include <algorithm>
using namespace std;
int num[200005],x[200005];
int main()
{
int n,i,j,k;
cin >> n;
for(i = 0;i < n;i++)
{
cin >> num[i];
}
sort(num,num+n);//将自然数从小到大排序
for(i = 0;i < n;i++)
{
//若这个数与前一个数相等,那么这个数出现的次数为前一个数出现的次数加1
if(num[i]==num[i-1])
{
x[i] = x[i-1] + 1;
}
//否则该数出现的次数为1
else
{
x[i] = 1;
}
}
for(i = 0;i < n;i++)
{
if(num[i]!=num[i+1])
//输出相同的数中的最后一个数,这个数的次数为最终出现次数
cout << num[i] << " " << x[i] << endl;
}
return 0;
}