一、题目
二、解题
1.思路
统计一个数组中出现次数不为0的元素,并按照出现次数从大到小排序,如果次数相同则按照元素值从小到大排序。
程序初始化了一个大小为1005的数组a,用来统计各个元素出现的次数,然后从输入中读取n个整数,将每个整数出现的次数在a中进行统计。接着,程序创建了一个结构体数组s,用来存储每个出现次数不为0的元素及其出现次数,这个结构体有两个成员变量:n和c,分别存储元素和出现次数。遍历a数组,将所有出现次数不为0的元素存到结构体数组s中。然后通过sort函数对结构体数组s进行排序,最后将排序后的结果输出。
值得一提的是,代码中的sort函数的排序规则是在结构体中定义的。定义bool类型的小于号运算符(<),判断两个结构体的大小关系,当它们的出现次数不同时,出现次数多的排在前面;当它们的出现次数相同时,元素值小的排在前面。
2.代码
dev c++ 5.11
#include<iostream>
#include<algorithm>
using namespace std;
int a[1005];
struct data{
int n;
int c;
bool operator < (const data& t) const{
if(c!=t.c) return c>t.c;
else return n<t.n;
}
}s[1005];
int main(){
int n,temp=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>temp;
a[temp]++;
}
int cnt=0;
for(int i=0;i<1005;i++){//1005不能改成n
if(a[i])
s[cnt++]={i,a[i]};
}
sort(s,s+cnt);
for(int i=0;i<cnt;i++){
cout<<s[i].n<<" "<<s[i].c<<endl;
}
return 0;
}
3.提交结果
总结
1.优化
使用了C++ STL中的map容器,并利用pair<int,int>对数字和对应出现次数进行存储,使用sort()函数对pair<int,int>的second频次进行降序排列,如果second相同,则按first进行升序排列。最后输出即可。
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
int main(){
int n,temp=0;
map<int,int> mp;
cin>>n;
for(int i=0;i<n;i++){
cin>>temp;
mp[temp]++;
}
vector<pair<int,int>> v(mp.begin(), mp.end());
sort(v.begin(), v.end(), [](const pair<int,int>& x, const pair<int,int>& y){
if(x.second != y.second) return x.second > y.second;
else return x.first < y.first;
});
for(int i=0; i<v.size(); i++){
cout<<v[i].first<<" "<<v[i].second<<endl;
}
return 0;
}