/*
题意:
1、统计出现的单词数,最多的那个
单词定义为大小写字母、数字的组合
除大小写字母,数字之外的字符都作为单词的分割负
字母不区分大小写,且最后按小写字母输出
解题:
1、用map,一个string,一个int,统计出现次数
2、但是大小写问题如何处理
如何写呢,我滴吗
learn && wrong:
1、for记得用分隔号啊
2、大写转为小写,是+=32
3、思路
(1)如果是有效字符,则加入当前字符,(记得大小写转换
(2)、如果不是,则将当前单词字符+1,
(3)之后跳过非有效字符
(4)遍历MAP,找出最多次数
4、字符串中可能出现连续的非空字符,所以得到一个单词之后必须while把它们全部跳过
5、字符串内的开头可能存在非有效字符,此时会得到空的单词,所以需要加IF判断是否为空单词,是则跳过
*/
#include <iostream>
#include <string>
#include <map>
using namespace std;
//检查是否符合数字,大小写字母
bool check(char c) {
if (c >= '0' && c <= '9') return true;
if (c >= 'A' && c <= 'Z') return true;
if (c >= 'a' && c <= 'z') return true;
return false;
}
int main()
{
map<string, int> count; //count计算字符串出现的次数
string str;
getline(cin, str); //读入整行字符
int i = 0; //定义下标
while (i < str.length()) { //在字符串范围内
string word;
while (i < str.length() && check(str[i]) == true) { //如果是查询的单词
if (str[i] >= 'A' && str[i] <= 'z') {
str[i] += 32; //将大写字符转为小写字母 !!!
}
word += str[i]; //单词末尾添加该字符
i++; //下标后移一位
}
if (word != "") {
if (count.find(word) == count.end()) count[word] = 1; //!!!
else count[word]++;
}
while (i < str.length() && check(str[i]) == false) { //跳过非单词字符 1!!错在括号
i++;
}
}
string ans; //存放出现次数最多的单词
int MAX = 0; //出现单词次数最多的次数
for (map<string, int>::iterator it = count.begin();it != count.end();it++) {
if (it->second > MAX) {
MAX = it->second;
ans = it->first;
}
}
cout << ans << " " << MAX << endl;
return 0;
}
网友评论