hi,我是小汉堡,今天我们来讲词频统计这道题,直接开始
题目链接
题目详情
题目描述
在文本处理中,统计单词出现的频率是一个常见的任务。现在,给定
n
n
n 个单词,你需要找出其中出现次数最多的单词。在本题中,忽略单词中字母的大小写(即 Apple
、apple
、APPLE
、aPPle
等均视为同一个单词)。
请你编写一个程序,输入 n n n 个单词,输出其中出现次数最多的单词。
输入格式
第一行,一个整数 n n n,表示单词的个数;
接下来 n n n 行,每行包含一个单词,单词由大小写英文字母组成。
输入保证,出现次数最多的单词只会有一个。
输出格式
输出一行,包含出现次数最多的单词(输出单词为小写形式)。
输入输出样例 #1
输入 #1
6
Apple
banana
apple
Orange
banana
apple
输出 #1
apple
说明/提示
对于所有测试点, 1 ≤ n ≤ 100 1\leq n\leq 100 1≤n≤100,每个单词的长度不超过 30 30 30,且仅由大小写字母组成。
题目分析
这道题是**普及-**的题,比较简单,不过得用哈希表,没学过的赶快学一下(我会后续更新)。为啥一看就是哈希表的题呢?因为算法标签上有,因为一看是搞统计的,必用哈希。但是用哈希统计出现次数是很简单的,但是题上有个要求:
忽略单词中字母的大小写(即 Apple、apple、APPLE、aPPle 等均视为同一个单词)
这就难了,因为用find函数不能找到大小写不一的字符串:假如存进哈希表了一个a,后面又遇到了A,用find就找不到A,就又存了一个A,但是题上要就他们是个词,如何解决?记得大小写转换吗?我们把每个单词都变成小写不就完了!
方法一
code
#include<bits/stdc++.h>
using namespace std;
int main(){
unordered_map<string,int> hashbbb;
int n,maxn=-999;
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]>='A'&&s[i]<='Z')
s[i]+=32;
}
auto it=hashbbb.find(s);
if(it!=hashbbb.end()){
it->second++;
}else{
hashbbb[s]=1;
}
}
auto maxit=hashbbb.begin();
for(auto it=hashbbb.begin();it!=hashbbb.end();it++){
if(maxn<it->second){
maxit=it;
maxn=it->second;
}
}
cout<<maxit->first;
return 0;
}
代码详解
第5行:定义了一个哈希表。索引是单词,所以是string类型,内容表示这个单词出现了几次,所以是int类型,哈希表叫hashbbb(我爱用这个名字)。
第8行:循环n,把每个单词输入进来,然后做存储或这统计工作。
第9~10行:定义单词,并输入。
第11~14行:将单词的每个字母都转为小写,相信你们都会,但我还是讲一下:先循环每个字母,判断这个字母是不是 ≥ A \ge A ≥A而且 ≤ Z \le Z ≤Z,意思是是否是大写字母,因为每个字母都有编码,大写字母的编码 ≥ A \ge A ≥A而且 ≤ Z \le Z ≤Z。这里有相似详细的讲解。
第15~20行:先定义一个auto变量it(啥是auto我就默认你们知道,如果不知道等我更新哈希表讲解),然后找一下s这个单词,赋值给it。接着,如果it不等于哈希表的最后,那说明找到了,之前出现过这个词,it就在找到的那个位置,让这个位置的第二层,也就是内容自增1,因为这个词又多了一个:也就是当前的s。如果等于哈希表的最后,那就说明没找到这个单词,也就是之前没有这个单词,那就新存一下这个单词: h a s h b b b [ s ] = 1 hashbbb[s]=1 hashbbb[s]=1,方括号里填索引,等号后面填内容,我们是在找单词有没有的:有的话统计就是这个单词个数++、每的话存储,所以单词就是索引。因为已经有一个这个单词了:就是当前这个单词,所以存为1。
第22~28行:定义了maxit,和maxn(maxn在上边)。maxit表示出现次数最多的单词的迭代器,maxn表示出现次数最多的单词的出现次数。23行循环整个哈希表。循环里判断当前循环到的单词的位置的次数是否比当前最多次数大,如果大:更新maxn和maxit。如果不大:啥都不干。
第29行:输出最大的次数对应的单词,就是索引。正好存进哈希的是单词的全小写,题上也这样要求。
于是通过了
总结
这道题偏中等,我没想到三级考哈希,建议大家亲手写一写代码。这道建议学完哈希需要练习的同学练。好了,我是小汉堡,请您点个赞和关注,谢谢!顺便点一下投票吧!