单词个数(map应用)

该问题要求统计一篇文章中出现频率最高的和最低的单词。输入是一篇长度不超过10000字符的文章,单词间由空格或换行隔开,输出包括最高频和最低频单词及其出现次数。若最高或最低频不唯一,则输出"NO ANSWER"。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem A: 单词个数

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 23  Solved: 4
[Submit][Status][Web Board]

Description

有一篇文章,请你统计出出现频次最高的单词和最低的单词。如果最高词或最低词不唯一,则用NO ANSWER代替

Input

输入一篇文章, 长度不超过10000字符。 单词之间用空格或换行隔开,除大小写字母和空格换行外不包含其他字符. 不同的单词个数不超过500.

Output

输出两行,第一行为出现频次最高单词以及出现次数,若不唯一则输出”NO ANSWER”,不包含双引号。第二行为出现频次最低单词以及出现次数,若不唯一则输出”NO ANSWER”,不包含双引号。

Sample Input

shooting is at shanghai station shooting must be carried out shooting shooting shanghai station must be surrounded at least a team of one hundred soldiers to fight twenty five soldiers shooting in the north twenty five
### 使用 C++ 实现单词个数统计 以下是基于标准库的功能实现的一个简单示例,用于统计输入流中的单词数量并按照字典顺序输出每个单词及其出现次数: ```cpp #include <iostream> #include <sstream> // istringstream #include <string> #include <map> using namespace std; int main() { map<string, int> wordCount; string line, word; // 提示用户输入数据 cout << "请输入一段文字(以 EOF 结束):" << endl; // 处理多行输入直到遇到 EOF while (getline(cin, line)) { istringstream iss(line); while (iss >> word) { // 将每行分割成单词 ++wordCount[word]; // 统计单词频率 } } // 输出结果 for (const auto& pair : wordCount) { cout << pair.first << ": " << pair.second << "次" << endl; } return 0; } ``` #### 功能说明 上述代码实现了以下功能: 1. **读取输入**:通过 `getline` 函数逐行读取用户的输入[^2]。 2. **分词处理**:利用 `istringstream` 对每一行的内容进行分解,提取其中的单词[^5]。 3. **统计频次**:借助 STL 中的 `map` 容器记录每个单词出现的次数。 4. **排序输出**:由于 `map` 默认按键值升序排列,最终可以直接遍历容器输出结果。 --- ### 高效版本优化 如果需要更高效的解决方案,可以通过自定义哈希表替代默认的红黑树结构。下面是一个使用 `unordered_map` 的改进版代码: ```cpp #include <iostream> #include <sstream> #include <string> #include <unordered_map> using namespace std; int main() { unordered_map<string, int> wordFrequency; // 更快的查找速度 string line, word; cout << "请输入一段文字(以 EOF 结束):" << endl; while (getline(cin, line)) { istringstream iss(line); while (iss >> word) { ++wordFrequency[word]; } } // 排序输出 vector<pair<string, int>> sortedWords(wordFrequency.begin(), wordFrequency.end()); sort(sortedWords.begin(), sortedWords.end()); for (const auto& p : sortedWords) { cout << p.first << ": " << p.second << "次" << endl; } return 0; } ``` #### 改进点分析 1. 替换了 `map` 为 `unordered_map`,从而减少插入操作的时间复杂度至 O(1)[^3]。 2. 添加了一个额外的排序步骤,因为 `unordered_map` 不会自动保持键值有序性。 --- ### 扩展功能支持 对于更加复杂的场景需求,比如统计文件内的单词或者扩展到其他语言环境下的文本解析,可以参考如下方法: - 利用 `<fstream>` 库加载外部 `.txt` 文件作为输入源[^4]; - 考虑大小写敏感性和特殊字符过滤逻辑; 例如,在实际应用中可加入正则表达式清理非字母成分后再执行统计工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值