题目描述
解题思路
每一个e-mail地址都是有一定原则的(如题所述)。
对于每一个“@”,
“@”起向前遍历,找到一个字母则该类e-mail前半段多一种情况,直到找到字母、数字、“_”外的字符为止(原则1)
“@”起向后遍历,直到找到字符“.”,如果在途中找到字母、数字外的字符或者无字符,则“@”无对应的e-mail地址(原则3)
“.”起向后遍历,找到一个字母则该类e-mail后半段多一种情况,直到找到其他字符为止(原则5)
分析可知,该@对应的e-mail地址个数为上三种情况之积
解题代码
#include<iostream>
#include<string>
using namespace std;
string al="abcdefghijklmnopqrstuvwxyz";
string nu="0123456789";
string fu="_"; //这三个字符串是用来判断某字符是字母还是数字还是_
int main()
{
string s;
cin>>s;
int sum=0,l=s.size(),num1,num2,middle;
for(int i=0;i<l;i++)
{
num1=0;num2=0;middle=1; //对于每一个@初始化
if(s[i]=='@'&&i!=0) //排除首字符是@的情况,没有也没事,用另一种方法时才考虑
{
//前半段
for(int j=i-1;j>=0;j--)
{
if(al.find(s[j])==-1&&nu.find(s[j])==-1&&s[j]!='_') break;
if(al.find(s[j])==-1) continue;
else
{
num1++;
}
}
//中半段
int k=i+1;
if(s[k]=='.'||k>=l) continue;
for(;s[k]!='.'&&k<l;k++)
{
if(al.find(s[k])==-1&&nu.find(s[k])==-1)
{
middle=0;
break;
}
}
//后半段
for(int q=k+1;q<l&&q<l;q++)
{
if(al.find(s[q])!=-1) num2++;
else break;
}
sum+=num1*middle*num2;//求该@对应种数
}
}
cout<<sum;
}
解题心得
显然这是一个模拟题,刚开始的思维就是找到@再判断附近字符计数,后来想了想是不是太麻烦了,于是觉得可以找到一对“@”和“.”,写着写着越发不对劲,越写越乱,所以对于模拟题,只要题目没有明显的时间限制,别想太多,按照正常的思维走更合适,巧妙的思维反而容易乱。