社区讨论

站外题

题目总版参与者 5已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mez855b8
此快照首次捕获于
2025/08/31 13:02
6 个月前
此快照最后确认于
2025/11/03 23:39
4 个月前
查看原帖
站外题求解50分

单词统计

描述

mjcmjc(其实就是我的名字,这个呢不重要)是一位文本编辑,他需要统计一篇文章中每个单词的出现次数,并生成每个单词出现次数的报告。他希望你能帮助他编写一个程序来实现这个任务。
给定一个包含小写英文字母、空格字符、,.组成的字符串,表示一篇文章。单词是由小写英文字母组成(不能为空串,不能不含其它字符),文章中以空格字符、,.隔开每个单词。
你需要统计这篇文章中每种单词的出现次数,并按照单词的出现次数降序排列输出单词,如果出现次数相同时,则按照单词的字典序升序排列输出单词。

输入

输入为一个包含小写英文字母、空格字符、,.组成的字符串,表示待统计的文章。文本总长度不超过 10001000 个字符。

输出

输出第一行,一个整数 cntcnt,表示文章中不同单词的数量。
接下来 cntcnt 行,每行以空格隔开输出排序后每个单词以及该单词在文章中出现的次数。

输入样例 1

this is a test, this is only a test.

输出样例 1

5
a 2
is 2
test 2
this 2
only 1

提示

文章中共有 55 种单词,每种单词的出现次数:
  • this22 次;
  • is22 次;
  • a22 次;
  • test22 次;
  • only11 次;
排序的顺序为:a is test this only
CPP
#include<bits/stdc++.h>
using namespace std;
map<string,int> a;
bool cmp(pair<string,int> a,pair<string,int> b) {
	return a.second>b.second;
}
int main() {
	string s;
	getline(cin,s);
	s+=",";
	int len=s.size();
	string c;
	for(int i=0;i<len;i++) {
		if(s[i]>='A' && s[i]<='Z')
			s[i]=(char)s[i]-'A'+'a';
		if(s[i]!=' ' && s[i]!=',' && s[i]!='.')
			c+=s[i];
		else {
			if(s[i-1]==',' || s[i-1]==' ' || s[i-1]=='.' || i==0)
				continue;
			a[c]++;
			c="";
		}
	}
	cout<<a.size()<<endl;
	vector<pair<string,int>> v(a.begin(),a.end());
	sort(v.begin(),v.end(),cmp);
	for(auto i=v.begin();i!=v.end();i++)
		cout<<i->first<<" "<<i->second<<"\n";
	return 0;
}
求条必壶关

回复

7 条回复,欢迎继续交流。

正在加载回复...