码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode: Valid Number [066]

时间:2014-06-04 23:45:09      阅读:388      评论:0      收藏:0      [点我收藏+]

标签:leetcode   算法   面试   

【题目】


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) 1, -1, +1, 0, +0, -0
       (2) 0.1, -0.1, +0.1
       (3) .1, +.1, -.1
       (4) 1., +1., -1.
       (5) 上面4种情况与e|E的组合,e|E右边只能是整数。 也就是说小数点最多只能出现1次,且必须出现在E的左边
        
        评判规则:
        1. 只能包含数字、小数点、正负号、E|e,头尾能包含空格
        2. e的前后必须有数字
        3. e的前面可以是小数,后面必须是整数
        4. e的前后都可以有正负号
        5. 小数点两边至少有一边是数字


【代码】

class Solution {
public:

    bool isNumber(const char *s) {
        if(s==NULL)return false;
        int len=strlen(s);
        int p1=0, p2=len-1;
        bool hasDot=false;  //标记小数点是否已经出现过
        bool hasSign=false;  //标记正负号是否已经出现过
        bool hasE=false;    //标记e是否已经出现过
        
        while(p1<=p2&&s[p1]==' ')p1++;
        while(p1<=p2&&s[p2]==' ')p2--;
        if(p1>p2)return false;  //去掉首尾的空格
        
        
        //第一个字符可以是数字,小数点,正负号
        if(!(isdigit(s[p1]) || s[p1]=='-' || s[p1]=='+' || s[p1]=='.')) return false;
        else{
            if(s[p1]=='-' || s[p1]=='+'){
                hasSign=true;
                if(p1>=p2 || (s[p1+1]!='.' && !isdigit(s[p1+1])))return false;  //如果正负号出现在第一位,则其后必须是小数点或者数字
            }
            else if(s[p1]=='.') {
                hasDot=true;
                if(p1>=p2 || !isdigit(s[p1+1])) return false;//如果小数点出现在第一位,则他的后面必须出现数字。
            }
            p1++;
        }
        //最后一个字符必须是数字或者小数点
        if(!isdigit(s[p2]) && s[p2]!='.')return false;
        
        
        while(p1<=p2){
            if(isdigit(s[p1])){
                p1++;
            }
            else if(s[p1]=='-' || s[p1]=='+'){
                //e的前后都能出现正负号,如果E已经出现过,则此时还能出现一次正负号。因此需要把标志位恢复成初始状态。
                if(hasE)hasSign=false;  
                if(hasSign)return false;    //如果已经出现过正负号,则再出现是非法的
                if(s[p1-1]!='e' && s[p1-1]!='E') return false;  //正负号只可能出现在第一位或者紧跟着e出现
                if(p1>=p2 || (s[p1+1]!='.' && !isdigit(s[p1+1])))return false;  //正负号后必须是小数点或者数字
                hasSign=true;
                p1++;
            }
            else if(s[p1]=='.'){
                if(hasDot)return false; //小数点最多只能出现一次,且必须出现在e之前
                if(hasE)return false;   //小数点只能出现在E之前
                if(p1==p2 && !isdigit(s[p1-1])) return false;
                if(p1<p2 && !isdigit(s[p1-1]) && !isdigit(s[p1+1]))return false; //小数点前后必须至少有一个位置出现数字。
                hasDot=true;
                p1++;
            }
            else if(s[p1]=='e' || s[p1]=='E'){
                if(hasE)return false;   //E只能出现一次
                if(s[p1-1]!='.' && !isdigit(s[p1-1]))return false;  //e前面必须是小数点或者数字
                if(s[p1+1]!='+' && s[p1+1]!='-' && !isdigit(s[p1+1]))return false;  //e后面必须是正负号,或者数字
                hasE=true;
                p1++;
            }
            else return false;
        }
        
        return true;
        
    }
};


LeetCode: Valid Number [066],布布扣,bubuko.com

LeetCode: Valid Number [066]

标签:leetcode   算法   面试   

原文地址:http://blog.csdn.net/harryhuang1990/article/details/27171115

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!