Valid Number

题目:

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

分析:此题的确很难,难点在于需要考虑的情况太多,列举如下:

1、空格不能出现在数字之间

2、点和e最多只能出现一次

3、出现e之前必须有数字

4、正负号要么出现在数字的最前面,要么出现在紧接着e后面

5、e后面必须还得有数字

6、正负号最多出现两次

代码如下:

//注意:刚出现的空格不用计数,直到数字、点、e或者正负号出现后的空格才需要计数。

        bool isNumber(const char *s) {
        if(s==NULL)return false;
        int num=0,numdot=0,nume=0,numkg=0,numsign=0;//分别表示数字、点、e、空格以及正负号的个数
        bool flag=false;
        while(*s!='\0')
        {
            if(int(*s-'0')>=0&&int(*s-'0')<=9)
            {
                if(numkg>0)
                {
                    return false;
                }
                flag=false;
                num++;
                s++;
            }
            else
            {
                if(*s=='.')
                {
                    if(numdot>0||numkg>0||nume>0)
                    {
                        return false;
                    }
                    numdot++;
                    s++;
                }
                else
                {
                    if(*s==' ')
                    {
                        if(num!=0||numdot!=0||nume!=0||numsign!=0)
                        {
                            numkg++;
                        }
                        s++;
                    }
                    else
                    {
                        if(*s=='e')
                        {
                            if(num<=0||nume>0||numkg>0)
                            {
                                return false;
                            }
                            s++;
                            nume++;
                            flag=true;
                        }
                        else
                        {
                            if(*s=='+'||*s=='-')
                            {
                                if((nume==0&&num>0)||(nume==0&&numsign>0)||(nume==0&&numdot>0))
                                {
                                    return false;
                                }
                                if(nume==1&&*(s-1)!='e')
                                {
                                    return false;
                                }                        
                                s++;
                                numsign++;
                            }
                            else
                            {
                                return false;
                            }
                        }
                    }
                }

            }
        }
        if(num<=0||flag)
        {
            return false;
        }
        return true;
    }

好的,以下是代码形式的电话线路图状态: ``` @startuml title Telephone State Diagram [*] --> Idle : Initial State Idle --> Dialing : Off Hook Event Dialing --> Connecting : Valid Number Event Dialing --> Disconnected : Invalid/Wrong Number Event Connecting --> TimeOut : Timeout Event Connecting --> Connected : Called Phone Answers Event Ringing --> Connected : Called Phone Answers Event Connected --> Idle : On Hook Event Connected --> Busy Tone : Line Busy Event Connected --> TimeOut : Timeout Event Connected --> Disconnected : Timeout Event Connected --> Ringing : Play Message Event @enduml ``` 解释一下: - 初始状态为空闲状态(`[*] --> Idle : Initial State`)。 - 当电话机摘机时,电话状态从空闲状态转入拨号状态(`Idle --> Dialing : Off Hook Event`)。 - 当拨号有效号码时,电话状态从拨号状态转入连接状态(`Dialing --> Connecting : Valid Number Event`)。 - 当拨号号码无效或错误时,电话状态从拨号状态转入未连接状态(`Dialing --> Disconnected : Invalid/Wrong Number Event`)。 - 当连接超时时,电话连接状态从连接状态转入超时状态(`Connecting --> TimeOut : Timeout Event`)。 - 当被拨打的电话接听时,电话连接状态从连接状态或响铃状态转入已连接状态(`Connecting --> Connected : Called Phone Answers Event` 或 `Ringing --> Connected : Called Phone Answers Event`)。 - 当已连接状态的电话机挂机时,电话状态从已连接状态转入空闲状态(`Connected --> Idle : On Hook Event`)。 - 当已连接状态的电话线路忙碌时,电话状态从已连接状态转入忙音状态(`Connected --> Busy Tone : Line Busy Event`)。 - 当已连接状态的电话连接超时时,电话状态从已连接状态转入未连接状态(`Connected --> TimeOut : Timeout Event`)。 - 当已连接状态的电话播放信息时,电话状态从已连接状态转入响铃状态(`Connected --> Ringing : Play Message Event`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值