原题
分类
杂题
题意
找出一组序列中出现次数最多的字符串。
输入/输出 | 要求与格式 |
---|---|
样例数的确定 | 最后一个样例输入字符串个数为0代表样例输入结束 |
每个样例的输入 | 第一行为字符串个数 n n n,后 n n n行为具体字符串 |
输出结果 | 出现次数最多的单词内容 |
输出格式 | 每个案例独占一行 |
特别说明 | 保证每个输入都有唯一解 |
以下是数据范围:
数据 | 数据范围 |
---|---|
字符串个数 | 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1≤n≤1000 |
字符串长度 | 1 ≤ len ( a i ) ≤ 15 1 \leq \text{len} \left( a_i \right) \leq 15 1≤len(ai)≤15 |
题解
总体思路
思路 | 时间复杂度 | 具体解释 |
---|---|---|
map \text{map} map容器 | O ( n ) O \left( n \right) O(n) | 把字符串内容作为 key \text{key} key、出现次数作为 value \text{value} value存进 map \text{map} map容器中,最终遍历 map \text{map} map容器找出最大值对应的键值 |
题解代码
HDU(C++/G++)AC代码如下:
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int N;
map<string, int> mp;
map<string, int>::iterator it;
string s, st, res_s;
int max_num;
while (cin >> N, N)
{
//初始化map
mp.clear();
//数据接收、同时处理
for (int i = 1; i <= N; ++i)
{
cin >> s;
++mp[s];
}
//初始化结果量
max_num = 0;
//遍历map找最大
it = mp.begin();
while (it != mp.end())
{
if (max_num < it->second)
{
max_num = it->second;
res_s = it->first;
}
++it;
}
//输出结果
cout << res_s << endl;
}
return 0;
}
评价
这道题可以算是一道用来熟悉STL-map的题目吧。毕竟就算不用 map \text{map} map,多半也是需要自己用数组来构建一下类似的逻辑,倒不如直接用系统库<map>来的香。
补充
在我看来, map \text{map} map容器很适合用于记录某样东西出现多少次,原因如下:
- 访问方便,直接
mp[键]
就额可以访问其存储的次数信息。 - 添加方便,对于之前未出现过的键值对,默认其值为0,出现新的元素直接
mp[新键]++;
即可视为添加一组键值对。
对于 map \text{map} map容器的解释,往往是映射、键值对、字典,都比较好从字面上来理解。
下面补充一些 map \text{map} map容器常用的使用方法:
操作 | 使用示例 | 示例解释 |
---|---|---|
定义 map \text{map} map容器 | map<string, int> mp; | 定义一个string 到int 的映射mp |
访问元素 | cout << mp["Test"] << endl; | 输出字符串"Test" 在mp中对应的值 |
添加/修改元素 | mp["New"] = 6; | 将字符串"New" 在mp中对应的值设置为6 |
删除元素 | mp.erase("Test"); | 将字符串"Test" 在mp中相应的键值对删除 |
元素个数 | cout << mp.size() << endl; | 输出容器mp中元素的个数 |
清空 map \text{map} map容器 | mp.clear(); | 清空容器mp中所有元素 |
定义 map \text{map} map迭代器 | map<string, int>::iterator it; | 定义一个string 到int 的映射迭代器it |
指向 map \text{map} map容器头部的迭代器 | it = mp.begin(); | 将迭代器it定位到容器mp的头部 |
指向 map \text{map} map容器末尾的迭代器 | it = mp.end(); | 将迭代器it定位到容器mp的末尾 |
迭代器访问键 | cout << it->first << endl; | 输出迭代器it当前指向键值对的键 |
迭代器访问值 | cout << it->second << endl; | 输出迭代器it当前指向键值对的值 |