zoukankan      html  css  js  c++  java
  • 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.

     这题很无聊。

     1 public class Solution {
     2     public boolean isNumber(String s) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         if(s.trim().isEmpty()){  
     6             return false;  
     7         }  
     8         String regex = "[-+]?(\d+\.?|\.\d+)\d*(e[-+]?\d+)?";  
     9         if(s.trim().matches(regex)){  
    10             return true;  
    11         }else{  
    12             return false;  
    13         } 
    14     }
    15 }

    解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较优雅。本文参考了http://blog.csdn.net/kenden23/article/details/18696083里面的内容,在此致谢!

    首先这个题有9种状态:

    0初始无输入或者只有space的状态
    1输入了数字之后的状态
    2前面无数字,只输入了dot的状态
    3输入了符号状态
    4前面有数字和有dot的状态
    5'e' or 'E'输入后的状态
    6输入e之后输入Sign的状态
    7输入e后输入数字的状态
    8前面有有效数输入之后,输入space的状态

    共9种状态了,难设计的是6,7,8状态。

    分好之后就好办了,设计出根据输入进行状态转换就OK了。

    这里的输入可以分:

    INVALID=0;#无效输入包括: Alphas, '(', '&' ans so on
    SPACE=1
    SIGN=2 # '+' or '-'
    DIGIT=3 # numbers
    DOT=4 # '.'
    EXPONENT=5 # 'e' or 'E'

    转移矩阵A(9X6)如下:

    -1,  0,  3,  1,  2,  -1
    -1,  8, -1,  1,  4,   5
    -1, -1, -1,  4, -1, -1
    -1, -1, -1,  1, 2,  -1
    -1,  8, -1,  4, -1,  5
    -1, -1,  6,  7, -1, -1
    -1, -1, -1,  7, -1, -1
    -1,  8, -1,  7, -1, -1
    -1,  8, -1, -1, -1, -1

    行代表了9种状态,列代表了6种输入方式也就是6种跳转方式。举个例子:A[0][2]=3,这有什么含义呢?意思是:第0种状态为【0初始无输入或者只有space的状态】,在输入第2种输入【SIGN=2 # '+' or '-'】后,会跳转到第3种状态【3输入了符号状态】。A[1][1]=8是什么意思呢?意思是:第1种状态为【1输入了数字之后的状态】,在输入第1种输入【SPACE=1】后,跳转到了第8种状态【8前面有有效数输入之后,输入space的状态】。

    根据以上的解释,大家应该明白什么事状态间的跳转了,这个共9种状态,所以是确定有穷自动机。其实难点在于状态的分割,要把每种情况都想到。

    而这9种状态中:只有1、4、7、8这四种状态合法,所以最后state跳转到这四种状态之一时,说明输入是合法的!

    状态转移图 from leetcode discuss:

     

     1 class Solution:
     2     # @param s, a string
     3     # @return a boolean
     4     # @finite automation
     5     def isNumber(self, s):
     6         INVALID=0; SPACE=1; SIGN=2; DIGIT=3; DOT=4; EXPONENT=5;
     7         #0invalid,1space,2sign,3digit,4dot,5exponent,6num_inputs
     8         transitionTable=[[-1,  0,  3,  1,  2, -1],    #0 no input or just spaces 
     9                          [-1,  8, -1,  1,  4,  5],    #1 input is digits 
    10                          [-1, -1, -1,  4, -1, -1],    #2 no digits in front just Dot 
    11                          [-1, -1, -1,  1,  2, -1],    #3 sign 
    12                          [-1,  8, -1,  4, -1,  5],    #4 digits and dot in front 
    13                          [-1, -1,  6,  7, -1, -1],    #5 input 'e' or 'E' 
    14                          [-1, -1, -1,  7, -1, -1],    #6 after 'e' input sign 
    15                          [-1,  8, -1,  7, -1, -1],    #7 after 'e' input digits 
    16                          [-1,  8, -1, -1, -1, -1]]    #8 after valid input input space
    17         state=0; i=0
    18         while i<len(s):
    19             inputtype = INVALID
    20             if s[i]==' ': inputtype=SPACE
    21             elif s[i]=='-' or s[i]=='+': inputtype=SIGN
    22             elif s[i] in '0123456789': inputtype=DIGIT
    23             elif s[i]=='.': inputtype=DOT
    24             elif s[i]=='e' or s[i]=='E': inputtype=EXPONENT
    25             
    26             state=transitionTable[state][inputtype]
    27             if state==-1: return False
    28             else: i+=1
    29         return state == 1 or state == 4 or state == 7 or state == 8

    Codes in Java:

     1 public class Solution {
     2     public boolean isNumber(String s) {
     3         int[][] transitionTable={{-1,  0,  3,  1,  2, -1},    //0 no input or just spaces 
     4                          {-1,  8, -1,  1,  4,  5},    //1 input is digits 
     5                          {-1, -1, -1,  4, -1, -1},    //2 no digits in front just Dot 
     6                          {-1, -1, -1,  1,  2, -1},    //3 sign 
     7                          {-1,  8, -1,  4, -1,  5},    //4 digits and dot in front 
     8                          {-1, -1,  6,  7, -1, -1},    //5 input 'e' or 'E' 
     9                          {-1, -1, -1,  7, -1, -1},    //6 after 'e' input sign 
    10                          {-1,  8, -1,  7, -1, -1},    //7 after 'e' input digits 
    11                          {-1,  8, -1, -1, -1, -1}};    //8 after valid input input space
    12                          
    13         int state = 0;
    14         for(int i = 0; i < s.length(); i ++){
    15             int input = 0;//0 invalid character
    16             char c = s.charAt(i);
    17             if(c == ' ') input = 1; //1 space
    18             else if(c == '-' || c =='+') input = 2; //2 sign
    19             else if(c >= '0' && c <= '9') input = 3; //3 digit
    20             else if(c == '.') input = 4;//4 dot
    21             else if(c == 'e' || c == 'E' ) input = 5;//5 exponent
    22             
    23             state = transitionTable[state][input];
    24             
    25             if(state == -1) return false;
    26         }
    27         
    28         return state == 1 || state == 4 || state == 7 || state == 8;
    29     }
    30 }
  • 相关阅读:
    Single Round Match 811 1~4 题解
    AtCoder Beginner Contest 215 A~F 题解
    Codeforces Round #739 (Div. 3) 题解
    Codeforces Round #737 (Div. 2) A~E 题解
    Codeforces Round #735 (Div. 2) A~D 题解
    CodeChef Starters 6 Division 3 题解
    AtCoder Beginner Contest 209 题解
    Codeforces Round #732 (Div. 2) A~D题解
    【YBTOJ】约数之和
    【Luogu P7794】[COCI2014-2015#7] JANJE
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3349079.html
Copyright © 2011-2022 走看看