close

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(object):
    def isNumber(self, s):
        """
        :type s: str
        :rtype: bool
        """
        isnum1, isnum2 = False, False
        isfloat = False
        isexp = False
        s = s.strip()
        i = 0
        if i < len(s) and s[i] in '+-':
            i += 1
        while i < len(s) and s[i] in '0123456789':
            isnum1 = True
            i += 1
        if i < len(s) and s[i] == '.':
            isfloat = True
            i += 1
            while i < len(s) and s[i] in '0123456789':
                isnum2 = True
                i += 1
        isnum1 = isnum1 or isnum2
        if i < len(s) and isnum1 and s[i] in 'eE':
            # reset
            isnum1 = False
            isfloat = False
            i += 1
            if i < len(s) and s[i] in '+-':
                i += 1
            while i < len(s) and s[i] in '0123456789':
                isnum1 = True
                i += 1
        if i == len(s) and isnum1:
            return True
        return False


class Solution:
    # @param s, a string
    # @return a boolean
    # @finite automation
    def isNumber(self, s):
        INVALID=0; SPACE=1; SIGN=2; DIGIT=3; DOT=4; EXPONENT=5;
        #0invalid,1space,2sign,3digit,4dot,5exponent,6num_inputs
        transitionTable=[[-1,  0,  3,  1,  2, -1],    #0 no input or just spaces 
                         [-1,  8, -1,  1,  4,  5],    #1 input is digits 
                         [-1, -1, -1,  4, -1, -1],    #2 no digits in front just Dot 
                         [-1, -1, -1,  1,  2, -1],    #3 sign 
                         [-1,  8, -1,  4, -1,  5],    #4 digits and dot in front 
                         [-1, -1,  6,  7, -1, -1],    #5 input 'e' or 'E' 
                         [-1, -1, -1,  7, -1, -1],    #6 after 'e' input sign 
                         [-1,  8, -1,  7, -1, -1],    #7 after 'e' input digits 
                         [-1,  8, -1, -1, -1, -1]]    #8 after valid input input space
        state=0; i=0
        while i<len(s):
            inputtype = INVALID
            if s[i]==' ': inputtype=SPACE
            elif s[i]=='-' or s[i]=='+': inputtype=SIGN
            elif s[i] in '0123456789': inputtype=DIGIT
            elif s[i]=='.': inputtype=DOT
            elif s[i]=='e' or s[i]=='E': inputtype=EXPONENT
            
            state=transitionTable[state][inputtype]
            if state==-1: return False
            else: i+=1
        return state == 1 or state == 4 or state == 7 or state == 8

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 g0d2 的頭像
    g0d2

    kazi1@的部落格

    g0d2 發表在 痞客邦 留言(0) 人氣()