PAT-A-1071 Speech Patterns (25)

题目

题目链接 统计一行内出现最多次数的单词。 ## 输入 每个测试有一行不超过1048576个字符,以回车''结尾,输入至少包含一个数字字母字符,即[0-9 A-Z a-z]中的一个。 ## 输出 在一行中输出给定文本中最常出现的单词,后跟一个空格和输入中出现的次数,如果有多个这样的单词,输出字典上最小的单词,全部小写。

单词的定义是:一串字母数字的连续序列,这个序列由非字母数字或者行开始或者行结束分隔开的。

比如

Can1: "Can a can can a can? It can!"

在这句话中,忽略大小写的话,can一共出现了5次,但是can1就不能算进去。 # 解题 ## 思路分析 其实就是统计单词个数,输出出现最多次数的单词。 ## Tips 使用Map。 ## 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<iostream>
#include<string>
#include<map>
#pragma warning(disable:4996)
using namespace std;
map<string, int> res;
string str, word;

void solution()
{
getline(cin, str); //有空格就用getline
for (int i = 0; i < str.size(); i++)
{
while ((str[i] >= 'A'&&str[i] <= 'Z') || (str[i] >= 'a'&&str[i] <= 'z') || str[i] >= '0'&&str[i] <= '9') //如果是有效的字符
{
if (str[i] >= 'A'&&str[i] <= 'Z')
str[i] = 'a' + str[i] - 'A';
word += str[i];
i++;
}
if (word.size())
{
res[word]++;
word.clear();
}
}
int MaxNum = 0;
auto i = res.begin();
auto temp = i;
for (; i != res.end(); i++)
{
if (i->second > MaxNum)
{
MaxNum = i->second;
temp = i;
}
}
cout << temp->first << ' ' << temp->second;
}

int main()
{
freopen("1.txt", "r", stdin);
solution();
system("pause");
return 0;
}

测试数据

1
2
3
4
Sample Input:
Can1: "Can a can can a can? It can!"
Sample Output:
can 5