数据结构第一次实验题解报告
一、7—1重复计数
在一个有限的正整数序列中,有些数会多次重复出现。请你统计每个数的出现次数,然后按数字在序列中第一次出现的位置顺序输出数及其次数。
输入格式:
第1行,1个整数N,表示整数的个数,(1≤N≤50000)。
第2行,N个正整数,每个整数x 都满足 1 ≤ x ≤2000000000。
输出格式:
若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数,第二个是该数在序列中出现的次数。
输入样例:
在这里给出一组输入。例如:
12
8 2 8 2 2 11 1 1 8 1 13 13
输出样例:
在这里给出相应的输出。例如:
8 3
2 3
11 1
1 3
13 2
方法一:
看到这个题目很自然想到用一个2000000000的数组来保存x出现的次数,但是这个空间不太能开到,所以先直接上暴力法。
#include<iostream>
#include<algorithm>
#define max 50001
using namespace std;
int main(){
int a[max],x,N;
int times[max],i,j,count=0;
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&x);
for(j=0;j<=count;j++){
if(a[j]==x){
times[j]++;
break;
}
}
if(j>count){
count++;
a[count]=x;
times[count]=1;
}
}
}
for(i=1;i<=count;i++){
printf("%d %d",a[i],times[i]);
if(i!=count) printf("\n");
}
}
这个思路非常简单,可是时间复杂度却到了O(n^2),这是我们不想要的,所以我们需要考虑更高效的解法。
方法二:
当时一个同学讲建立映射给我印象挺深刻的,所以我后来也尝试看看map容器,并参考同学算法写了代码
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
map<int,int> mp;
int data[500005];
int main(){
int cnt=1,i,x,N;
scanf("%d",&N);
for(i=1;i<=N;i++){
scanf("%d",&x);
if(mp.count(x)!=0) mp[x]++;
else{
mp.insert(pair<int,int>(x