E-mail地址

题目描述

 

 

解题思路

每一个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;
}

解题心得

显然这是一个模拟题,刚开始的思维就是找到@再判断附近字符计数,后来想了想是不是太麻烦了,于是觉得可以找到一对“@”和“.”,写着写着越发不对劲,越写越乱,所以对于模拟题,只要题目没有明显的时间限制,别想太多,按照正常的思维走更合适,巧妙的思维反而容易乱。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值