这题不算太难,我的整体思路和书上差不多,但是实现方法不一样,我是读一个字符,就处理一次,遇到不符合条件的,直接跳过,符合条件的,就计数。
书上的代码如下:
#include <cstdio>
#include <string>
#include <iostream>
#include <map>
using namespace std;
bool check(char c){
if ((c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z')){
return true;
} else {
return false;
}
}
int main(){
map<string, int> count;
string str;
getline(cin,str);
int i=0;
while (i<str.length()){
string word;
while (i<str.length() && check(str[i])){
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])){
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;
}
我的代码如下:
#include <cstdio>
#include <string>
#include <map>
#include <iostream>
using namespace std;
map <string , int > mp;
int isValid(char c){
if ((c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z')){
return 1;
} else {
return 0;
}
}
int main(){
char c;
string word="";
while (1){
scanf("%c",&c);
if (isValid(c)){
if (c>='A'&& c<='Z') c+=32;
word+=c;
}else if (word!=""){
if (mp.find(word)!=mp.end())mp[word]++;
else mp[word]=1;
word="";
}
if (c=='\n') break;
}
string maxIndex=mp.begin()->first;
for (map<string, int>::iterator it=mp.begin(); it!=mp.end(); it++){
if (it->second>mp[maxIndex]){
maxIndex=it->first;
}
}
cout<<maxIndex<<" "<<mp[maxIndex]<<endl;
}
仁者见仁,智者见智,我有边读边处理的习惯,是因为之前做题,如果读取完了之后再去处理,很多题有可能超时,就养成了边读边处理的思维方式。