字符串的题是我的弱项,因为我觉得我好像对数字感兴趣,其实这只是借口。
本题我在11月2号的时候只拿到了17分,已经忘了是怎么写的,早上做了半小时过了,我觉得让你在一串字符串中统计单词的问题需要注意三点:
1开始的时候需要注意单词的开始可能不是在这串东西的第0个位置,可能一开始带有几个空格或者其他非法字符,不过这只是可能,具体也要看题。我的处理的方法是到第一个合法字符开始统计
2中间可能有多个空格和非法字符,很多人觉得如果当前字符是非法的,开始把前面一段的字符定为一个单词,那么这样有一个问题 ,我连续两个非法的字符 ,会把空字符串也当做一个单词,我处理的方法是,碰到非法单词时,我在看看当前已经遍历到的串是否为空,若为空,那么说明是连续的非法字符,否则是一个新的单词
3结尾的时候可能会有字符没有被统计,比如结尾的时候是一个合法的字符,而我们的程序是碰到一个非法字符统计一次,那么最后那个单词时没有被统计过的,我的处理方法 是,循环结束后,再看看刚才保存遍历字符串是否为空,非空则再统计一次。
附代码如下:
#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<string>
using namespace std;
char c[1048577];
map<string,int >cl;
map<string,int >::iterator it;
int check(int i)
{
if(c[i]>='a'&&c[i]<='z')
return 1;
if(c[i]>='A'&&c[i]<='Z')
return 1;
if(c[i]>='0'&&c[i]<='9')
return 1;
return 0;
}
int main()
{
gets(c);
int i,j;
for(i=0;c[i];i++)
if(c[i]>='A'&&c[i]<='Z')
c[i]+=32;
for(i=0;c[i];i++)
if(check(i))
break;
string cc="";
int flag=0;
for(j=i;c[j];j++)
{
if(check(j))
cc+=c[j];
else
{
if(cc!="")
{
cl[cc]++;
cc="";
}
}
}
if(cc!="")
cl[cc]++;
int max=0;
string ans;
for(it=cl.begin();it!=cl.end();it++)
{
if(max<(*it).second)
{
max=(*it).second;
ans=(*it).first;
}
}
cout<<ans<<" "<<max<<endl;
}