dengxinyi 6 yıl önce
ebeveyn
işleme
87ea074de2
1 değiştirilmiş dosya ile 58 ekleme ve 0 silme
  1. 58 0
      hard/65.valid-number.java

+ 58 - 0
hard/65.valid-number.java

@@ -0,0 +1,58 @@
+class Solution {
+    // Numbers 0-9
+    // Exponent - "e"
+    // Positive/negative sign - "+"/"-"
+    // Decimal point - "."
+    public boolean isNumber(String s) {
+        // Finite automaton
+        // State No. | Discription
+        //    -1     | Invalid state
+        //     0     | Initail state
+        //     1     | Input sign
+        //     2     | Input digit
+        //     3     | Input dot
+        //     4     | Input digit and dot
+        //     5     | Input exp
+        //     6     | Input sign after exp
+        //     7     | Input digit after exp
+        //     8     | Input space after valid number
+        // Input state:
+        // INVALID, SPACE, SIGN, DIGIT, DOT, EXP
+        // Trans table:
+        // input ERR SPA SGN DIG DOT EXP
+        // state
+        //   0    -1   0   1   2   3  -1
+        //   1    -1  -1  -1   2   3  -1
+        //   2    -1   8  -1   2   3   5
+        //   3    -1  -1  -1   4  -1   5
+        //   4    -1   8  -1   4  -1   5
+        //   5    -1  -1   6   7  -1  -1
+        //   6    -1  -1  -1   7  -1  -1
+        //   7    -1   8  -1   7  -1  -1
+        //   8    -1   8  -1  -1  -1  -1
+        char[] num = s.toCharArray();
+        int[][] stateTable = new int[][] {
+            {-1,  0,  1,  2,  3, -1}, // 0
+            {-1, -1, -1,  2,  3, -1}, // 1
+            {-1,  8, -1,  2,  4,  5}, // 2
+            {-1, -1, -1,  4, -1, -1}, // 3
+            {-1,  8, -1,  4, -1,  5}, // 4
+            {-1, -1,  6,  7, -1, -1}, // 5
+            {-1, -1, -1,  7, -1, -1}, // 6
+            {-1,  8, -1,  7, -1, -1}, // 7
+            {-1,  8, -1, -1, -1, -1}  // 8
+        };
+        int state = 0;
+        for (int i = 0; i < num.length; i++) {
+            int input = 0;
+            if (num[i] == ' ') input = 1;
+            else if (num[i] == '+' || num[i] == '-') input = 2;
+            else if ('0' <= num[i] && num[i] <= '9') input = 3;
+            else if (num[i] == '.') input = 4;
+            else if (num[i] == 'e' || num[i] == 'E') input = 5;
+            state = stateTable[state][input];
+            if (state == -1) return false;
+        }
+        return state == 2 || state == 4 || state == 7 || state == 8;
+    }
+}