题目描述
输入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;
}
小结
-
数组除了可以存数以外,还可以用来做标记。
-
空间复杂度:如果是一个一维数组,那传入的数据是多少,空间复杂度就是多少。如果输入的数据是n个,那一维数组的空间复杂度就是O(N);同理,如果是二维数组且传入n个数据,那么这个二维数组的时间复杂度就是O(N^2)。
-
c和c++可以混合使用,哪个方便用哪个。本题中的头文件涵盖了所有头文件,即不需要再写其他头文件就可直接使用一些方法。
-
数组还可以嵌套使用。(升级版题)
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情