目录
1,题目描述
- synonym:同义词;
- narrow down:压缩,减小;
- validating:证实; 确认; 确证; 使生效; 使有法律效力; 批准; 确认…有效; 认可;
- avatar:化身;
- alphanumerical:字母数字混合编制的;
- lexicographically:字典序; 按字典顺序;
- insensitive:不敏感;
题目描述
找出一段话中出现次数最多的单词(字母数字混合,且不分大小写)。
2,思路
凭直觉来看,一定是用map了。
注意如何分割单词,并且大小写转换,基本上就没什么问题了。
3,AC代码
#include<bits/stdc++.h>
using namespace std;
bool isAlp(char c){
if((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
return true;
return false;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
map<string,int> data;
char c;
string s;
scanf("%c", &c);
while(c != '\n'){
if(isAlp(c)) s += c;
else{
if(s.size() != 0){
transform(s.begin(), s.end(), s.begin(), ::tolower);
data[s] += 1;
s.clear();
}
}
scanf("%c", &c);
}
if(s.size() != 0){
transform(s.begin(), s.end(), s.begin(), ::tolower);
data[s] += 1;
s.clear();
}
int max = 0;
for(auto it : data){
if(it.second > max){
s = it.first;
max = it.second;
}
}
cout<<s<<' '<<max;
return 0;
}
4,知识补充
大小写转换
大小写转换,可以看这里@荷叶田田_【【用法总结】C++中常用的大小写转换(4种常用方法)】
此处使用的是transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class
eg.string s = "Acdd";
transform(s.begin(), s.end(), s.begin(), ::tolower);//注意格式 tolower后没有括号
5,解题过程
第一搏
原以为代码天衣无缝,然而还是
#include<bits/stdc++.h>
using namespace std;
bool isAlp(char c){
if((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
return true;
return false;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
map<string,int> data;
char c;
string s;
scanf("%c", &c);
while(c != '\n'){
if(isAlp(c) == false && s.size() != 0){
transform(s.begin(), s.end(), s.begin(), ::tolower);
data[s] += 1;
s.clear();
}else s += c;
scanf("%c", &c);
}
int max = 0;
for(auto it : data){
if(it.second > max){
s = it.first;
max = it.second;
}
}
cout<<s<<' '<<max;
return 0;
}
第二搏
补充了红色方框内的代码(有可能到结尾,s内仍存有一个单词),测试点4通过了
第三搏
仔细一想,逻辑好像有点乱,于是重新调整了一下,改成了红色方框内的代码
PERFECT!