查找文章的热词

查找文章的热词(出现最多的次数)

**描述:**输入文章由标题和正文组成,并使用“”作为分隔符,标题出现的单词,系数为3,正文出现的单词系数为1。如果词语出现的词频系数相同,在标题中出现的频率次数高的排在前面,如果仍然相同,则按照词语在标题中出现的先后顺序进行排序,如果还相同,则按照词语在正文中的先后顺序进行排序。

输入:

第一行输入为正整数topN,和文章数M。每篇文章被处理为标题和正文两行。
3 2
标题1
正文1
标题2
正文2

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
//新建结构体
struct Node
{
	string s;
	int times;
	int titleTimes;
	int articleTimes;
};
//将整个字符串拆分成字符串单词数组
vector<string> getwords(string str) {
	vector<string>res;
	stringstream ss(str);
	string temp;
	while (ss >> temp) {
		res.push_back(temp);
	}
	return res;
}
//**运算符重载**
bool operator < (const Node& s1, const Node& s2) {
	if (s1.times == s2.times && s1.titleTimes == s2.titleTimes) {
		return s1.articleTimes > s2.articleTimes;
	}
	if (s1.times == s2.times) {
		return s1.titleTimes > s2.titleTimes;
	}
	return s1.times > s2.times;

}
int main() {
	int topN, m;
	cin >> topN >> m;
	string str1;
	string str2;
	unordered_map<string, Node>mp;
	//清除缓存区的字符
	getchar();
	int flag1 = 1;
	int flag2 = 1;
	while (m--) {
		//读取标题中的字符串
		getline(cin, str1);
		vector<string>words;
		words = getwords(str1);
		for (string s : words) {
			if (mp.find(s) != mp.end()) {
				mp[s].times = mp[s].times + 3;
			}
			else {
				mp[s].s = s;
				mp[s].times = 3;
				mp[s].articleTimes = flag1++;
			}
		}
		//读取正文中的字符串
		getline(cin, str2);
		words.clear();
		words = getwords(str2);
		for (string s : words) {
			if (mp.find(s) != mp.end()) {
				mp[s].times = mp[s].times + 1;
			}
			else {
				mp[s].s = s;
				mp[s].times = 1;
				mp[s].articleTimes = flag2++;
			}
		}
	}
	vector<Node>sortNode;
	for (auto iter = mp.begin(); iter != mp.end(); iter++) {
		sortNode.push_back(iter->second);
	}
	//排序
	sort(sortNode.begin(), sortNode.end());
	for (int i = 0; i < topN-1; i++) {
		cout << sortNode[i].s << ' ';
	}
	cout << sortNode[topN - 1].s;

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值