题目大意是说给出一个文本,找出里面出现最多的单词,如果有多个单词出现次数一样多,则输出字典序最小的。
需要注意的是:
给出的文本字符串不仅有数字还有字母,还有一些特殊的字符,还有空格。
而单词是只包含字母和数字,它是由非字母和数字分割的(这里一定要读懂题意)
Here a "word" is defined as a continuous sequence of alphanumerical characters separated by non-alphanumerical characters or the line beginning/end.
注意字母不区分大小写,但给出的文本中大小写字母都存在
Note that words are case insensitive.
当弄懂题意后,实际的思路还是比较简单的,我们只需要先把单词从整个字符串里面取出,然后放入哈希表中,最后输出出现次数最多的单词。
注意,不同的单词是用空格分割的,那么最后一个单词可能会不被统计,
因此最后要进行一个判断
for(int i=0;i<s.size();i++){if(s[i]!=' '){a+=s[i];//cout<<"1";}else{if(a.size()>0){mp[a]++;a.clear(); }}}if(a.size()>0){mp[a]++;}
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <unordered_map>
#include <limits.h>
using namespace std;
int N;
int D;
string s;
unordered_map<string,int> mp;
int main()
{//ios::sync_with_stdio(0),cin.tie(0),cout.tie(getline(cin,s);for(int i=0;i<s.size();i++){if(s[i]>='A'&&s[i]<='Z'){s[i]=char(s[i]-'A'+'a');}if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z')){}else{s[i]=' ';}} string a;for(int i=0;i<s.size();i++){if(s[i]!=' '){a+=s[i];//cout<<"1";}else{if(a.size()>0){mp[a]++;a.clear(); }}}if(a.size()>0){mp[a]++;}int maxx=INT_MIN;string temp;for(auto it:mp){if(it.second>maxx){maxx=it.second;temp=it.first;}else if(it.second==maxx){if(temp>it.first){temp=it.first;}}}cout<<temp<<" "<<maxx;return 0;}
考察点是哈希表和对字符串的操作,一定要读懂题意。