Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

https://leetcode.com/problems/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.

解题思路:

这题目的考察主要在于测试,如何考虑各种测试用例,来使自己的程序变得完整和健壮。

具体实现有很多种方法,我这里用的是有限状态机(Finite-state machine)的方法,和 String to Integer (atoi) 很像。优点是可以避免很复杂的if判断条件,缺点是可能搞清楚每个状态代表什么意思比较麻烦。

这题目的边界情况非常多,比如.3就是一个数字,6e.3,“12.e+231”呢?具体就不仔细说了,其实题目至少应该标出来,那些格式是正确的,哪些是错误的。否则只能写出程序,然后根据test case一点一点调试了。

public class Solution {
    public boolean isNumber(String s) {
        if(s == null || s.length() == 0) {
            return false;
        }
        int state = 0, i = 0;
        s = s.trim();
        while(i < s.length()) {
            if(state == 0) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 1;
                } else if(s.charAt(i) == '-' || s.charAt(i) == '+'){
                    state = 2;
                } else if(s.charAt(i) == ' ') {
                    i++;
                    continue;
                } else if(s.charAt(i) == '.'){
                    state = 3;
                } else {
                    return false;
                }
            } else if(state == 1) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 1;
                } else if(s.charAt(i) == '.') {
                    state = 4; //"3."
                } else if(s.charAt(i) == 'e') {
                    state = 5;
                } else {
                    return false;
                }
            } else if(state == 2) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 1;
                } else if(s.charAt(i) == '.') {
                    state = 3; // " -."
                } else {
                    return false;
                }
            } else if(state == 3) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 6;
                } else {
                    return false;//".e1"
                }
            } else if(state == 5) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 7;
                } else if(s.charAt(i) == '-' || s.charAt(i) == '+') {
                    state = 8;  //" 005047e+6"
                } else {
                    return false;
                }
            } else if(state == 6) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 6;
                } else if(s.charAt(i) == 'e') {
                    state = 5;
                } else {
                    return false;
                }
            } else if(state == 7) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 7;
                } else {
                    return false;
                }
            } else if(state == 4) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 6;
                } else if(s.charAt(i) == 'e') {
                    state = 5;//"46.e3"
                } else {
                    return false;
                }
            } else if(state == 8) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 9;
                } else {
                    return false;
                }
            } else if(state == 9) {
                if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    state = 9; //"4e+"
                } else {
                    return false;
                }
            }
            i++;
        }
        if(state == 0 || state == 5 || state == 3 || state == 8) {
            return false;
        }
        return true;
    }
}

 

posted on 2015-05-10 19:45  NickyYe  阅读(178)  评论(0)    收藏  举报