Monday, January 5, 2015

Valid Number

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

T:
The part before "e" should only contain numbers or "." with at least one number.
The part after "e" should only contain numbers. The "+"/"-" is an exception.

A:


class Solution {
public:
    bool isNumber(const char *s) {
        while(*s == ' ') {
            s++;
        }
        if(*s == '\0') {
            return false;
        }
        if(*s == '-' || *s == '+') {
            s++;
        }
        int dotseen = 0;
        int eseen = 0;
        int numseen = 0;
        while(*s != '\0') {
            if(*s >= '0' && *s <= '9') {
                if(numseen == 0) {
                    numseen = 1;
                }
            } else if(*s == '.') {
                if(!eseen && !dotseen) {
                    dotseen = 1;
                    if(!numseen && !(*(s+1) >= '0' && *(s+1) <= '9')) {
                        return false;
                    }
                } else {
                    return false;
                }
            } else if(*s == 'e') {
                if(numseen && !eseen){
                    eseen = 1;
                    if(!(*(s+1) >= '0' && *(s+1) <= '9') && !(*(s+1) == '-' || *(s+1) == '+')) {
                        return false;
                    }
                } else {
                    return false;
                }
            } else if(*s == '-' || *s == '+') {
                if(!(eseen && *(s-1) == 'e')) {
                    return false;
                }
                if(!(*(s+1) >= '0' && *(s+1) <= '9')) {
                        return false;
                }
            } else if(*s == ' ') {
                do {
                    s++;
                } while(*s == ' ');
                if(*s != '\0') {
                    return false;
                } else {
                    continue;
                }
            } else {
                return false;
            }
            s++;
        }
        return true;
    }
};

No comments:

Post a Comment