9.7 腾讯笔试

t3

题目大意:给n个字符串,然后统计出,出现次数前k多和前k少的(出现次数不能为0)的字符串
输入:
第一行n和k
下面n行,每行一个字符串

解题思路:用map存一下字符串出现次数,然后都拿到结构体里面,然后结构体排序,注意当次数一样的时候,要按字典序排序

具体看代码

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;
const int N = 3e5 + 10;
string s[N];
map<string , int>ans;
struct degfe
{
	int cnt;
	string s;
	bool operator < (const degfe & a) const
	{
		if(cnt==a.cnt)
			return s<a.s;
		return cnt < a.cnt;
	}
} e1[N];
bool cans(degfe a , degfe b)
{
	if(a.cnt==b.cnt)
		return a.s<b.s;
	return a.cnt > b.cnt;
}
signed main()
{
	int n , k;
	cin >> n >> k;
	for(int i=1; i<=n; i++)
	{
		string str;
		cin >> str;
		ans[str] ++ ;
	}
	int cnt = 0;
	for(auto i : ans)
		e1[++ cnt] = degfe {i.se , i.fi};
	sort(e1 + 1 , e1 + 1 + cnt , cans);
	for(int i=1; i<=k; i++)
	{
		cout << e1[i].s << " " << e1[i].cnt << endl;
	}
	sort(e1 + 1 , e1 + 1 + cnt);
	for(int i=1; i<=k; i++)
	{
		cout << e1[i].s << " " << e1[i].cnt << endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/13626229.html