排序并输出对应个数+升级版

54 阅读1分钟

题目描述

输入N,再输入N(N<=100)个数,每个数的范围> 0 并且<= 100,请将每个不同的数从小到大输出并且输出它对应的个数。

样例输入

8
3 2 2 1 1 4 5 5

样例输出

1 2
2 2
3 1
4 1
5 2

思路

用一个数组来记录每个值出现的次数,初始时数组的值赋为0。最后输出a[i]与i。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,x;
        int a[102]={0};
	scanf("%d",&n); //输入n
	for(int i=0;i<n;i++){
		scanf("%d",&x); //输入n个数
		a[x]++; //对应的数组下标++,以统计x的个数
	}
	for(int i=0;i<102;i++){
		if(a[i]>0){
			printf("%d %d\n",i,a[i]);
		}
	}
	return 0;
}

时间复杂度

  • 时间复杂度:O(n),n为n个数的数量。

  • 空间复杂度:O(n),n为n个数的数量。

升级版——题目描述

输入N,再输入N(N<=100)个数,每个数的范围> 0 并且<= 100,请将每个不同的数从小到大输出并且输出它对应的个数。要求按值出现的次数从小到大排序,如果多个值有相同的个数,只用输出值最大的那个。

样例输入

8
3 2 2 1 1 4 5 5

样例输出

4 1
5 2

思路

数组的嵌套使用

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,x;
	int count=0;
	cin>>n;
	int a[102]={0};
	int b[102]={0};
	for(int i=0; i<n; i++){
		cin>>x;
		a[x]++;
	}
	for(int i=0;i<102; i++){
		if(a[i]>0) b[a[i]]=i; //数组的嵌套使用 
	}
	for(int i=0;i<102; i++){
		if(b[i]>0) cout<<b[i]<<" "<<i<<endl;
	}
	return 0;
}

小结

  1. 数组除了可以存数以外,还可以用来做标记。

  2. 空间复杂度:如果是一个一维数组,那传入的数据是多少,空间复杂度就是多少。如果输入的数据是n个,那一维数组的空间复杂度就是O(N);同理,如果是二维数组且传入n个数据,那么这个二维数组的时间复杂度就是O(N^2)。

  3. c和c++可以混合使用,哪个方便用哪个。本题中的头文件涵盖了所有头文件,即不需要再写其他头文件就可直接使用一些方法。

  4. 数组还可以嵌套使用。(升级版题)

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情