数据结构第一次实验题解报告

数据结构第一次实验题解报告

一、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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值