Valid Number LeetCode and Interviewbit solution guide

Question: 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 upfront before implementing one.

Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts an const char * argument, please click the reload button to reset your code definition.

Solution of Valid Number:

The major stuck point in this question is handling the corner cases. So first we need to check the below conditions to satisfy and cover all the corner scenarios. As Input is in String format.
1. Remove the spaces from the input string.
2. check if the input is a negative number.
3. check if input starts or ends with ‘e’ or ‘.’.
4. Loop through the input string and convert the string in number and count the number of decimal found
if it is more than one-time return false.
5. Also count spaces if any in-between.
6. Check if ‘e’ appears before ‘.’ then return false.

Try yourself by seeing the above hints if you are still not able to pass all the test cases then see the below solution.

//C++ Solution
class Solution {
public:
    bool isNumber(string s) {
        if(s.size()==0)
            return 0;
        int i=0;
        int m = s.size()-1;
        int neg = 0;
        int number = 0;
        int countdec = 0,counte = 0;
        while(s[i]==' ')i++;
        if(i==s.size()) return 0;
        while(s[m]==' ')m--;
        if(s[i]=='-' || s[i]=='+'){
            neg = 1;
            i++;
        }
        if(s[i]=='e' || s[m]=='e') return 0;
        if(i==m && s[i]=='.') return 0;
        for(int j=i;j<=m;j++){
            if((s[j]>='0' && s[j]<='9') && countdec<=1 && counte<=1){
                number = number*10 + s[j]-'0';
            }else if(s[j]==' ') return 0;
            else if(s[j]=='.' && counte==0){
                 if(s[j+1]=='e' && (j+1==m||j==i))
                    return 0;
                 countdec++;
            }
            else if(s[j]=='e'){
                if(s[j+1]=='.')
                    return 0;
                if((s[j+1]=='+' || s[j+1]=='-') && j+1<m)
                    j++;
                counte++;
            }
            else return 0;
            if(countdec>1 || counte>1) 
                return 0;
        }
        return 1;
    }
};

Python Solution:

#Python Solution
class Solution(object):
    def isNumber(self, s):
        """
        :type s: str
        :rtype: bool
        """
        #define DFA state transition tables
        states = [{},
                 # State (1) - initial state (scan ahead thru blanks)
                 {'blank': 1, 'sign': 2, 'digit':3, '.':4},
                 # State (2) - found sign (expect digit/dot)
                 {'digit':3, '.':4},
                 # State (3) - digit consumer (loop until non-digit)
                 {'digit':3, '.':5, 'e':6, 'blank':9},
                 # State (4) - found dot (only a digit is valid)
                 {'digit':5},
                 # State (5) - after dot (expect digits, e, or end of valid input)
                 {'digit':5, 'e':6, 'blank':9},
                 # State (6) - found 'e' (only a sign or digit valid)
                 {'sign':7, 'digit':8},
                 # State (7) - sign after 'e' (only digit)
                 {'digit':8},
                 # State (8) - digit after 'e' (expect digits or end of valid input) 
                 {'digit':8, 'blank':9},
                 # State (9) - Terminal state (fail if non-blank found)
                 {'blank':9}]
        currentState = 1
        for c in s:
            # If char c is of a known class set it to the class name
            if c in '0123456789':
                c = 'digit'
            elif c in ' \t\n':
                c = 'blank'
            elif c in '+-':
                c = 'sign'
            # If char/class is not in our state transition table it is invalid input
            if c not in states[currentState]:
                return False
            # State transition
            currentState = states[currentState][c]
        # The only valid terminal states are end on digit, after dot, 
        # digit after e, or white space after valid input    
        if currentState not in [3,5,8,9]:
            return False
        return True

Follow us on Facebook and Twitter. For questions and queries or suggestions put them in the comment section. Read another article here.

Leave a Comment