LEETCODE: 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.

比较麻烦的一道题,要不断的实验和修正。因为我也不知道什么样的格式算是正确的数字。


class Solution {
public:
    bool isDigit(const char *ch) {
        return *ch >= '0' && *ch <= '9';
    }
    
    bool allspace(const char *ch) {
        while(*ch != '\0') {
            if(*ch != ' ')
                return false;
            ch ++;
        }
        return true;
    }
    bool isNumber(const char *s) {
        int ii = 0;
        // Remove the spaces in the front.
        while(*s == ' ') {
            s ++;
        }
        
        // Skip '+' or '-'.
        if(*s == '+' || *s == '-') {
            s ++;
        }
        
        // If nothing input, return false;
        if(*s == '\0')
            return false;
        
        // hasdleftnum represent has number. Or if has dot, represent has left number of the dot.
        // hasdrightnum represent has number after the dot.
        bool hasdleftnum = false;
        bool hasdrightnum = false;
        bool hasDot = false;
        // Process number before e.
        while(*s != '\0' && *s != 'e' && *s != 'E') {
            if(isDigit(s)){
                s ++;
                if(hasDot)
                    hasdrightnum = true;
                else
                    hasdleftnum = true;
                continue;
            }
            
            if(*s == '.') {
                s ++;
                if(hasDot)
                    return false;
                hasDot = true;
                continue;
            }
            
            if(*s == ' ') {
                if(allspace(s) && (hasdleftnum || hasdrightnum))
                    return true;
            }
            
            return false;
        }
        
        // If has dot, but no numbers, return false.
        if(hasDot && !hasdrightnum && !hasdleftnum)
            return false;
        
        // If is at end return true;
        if(*s == '\0') return true;
        
        //Process number after e.
        bool hasrightnum = false;
        if(*s == 'e' || *s == 'E') {
            s ++;
            if(*s == '+' || *s == '-') s ++;
            while(*s != '\0') {
                if(isDigit(s)) {
                    s ++;
                    hasrightnum = true;
                    continue;
                }
                
                if(*s == ' ') {
                    if(allspace(s) && hasrightnum && (hasdleftnum || hasdrightnum))
                        return true;
                }
                
                return false;
            }
        }
        
        // If has e, and both left and right of e has number, return true.
        if((hasdleftnum || hasdrightnum) && hasrightnum)
            return true;
            
        return false;
    }
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值