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.
[分析] 体会有限状态机思想的好题,详细分析参考[url]http://blog.youkuaiyun.com/suwei19870312/article/details/12094233[/url]
精简的代码真是赏心悦目~
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.
[分析] 体会有限状态机思想的好题,详细分析参考[url]http://blog.youkuaiyun.com/suwei19870312/article/details/12094233[/url]
精简的代码真是赏心悦目~
public class Solution {
private enum InputEnum {
invalid, space, sign, digit, dot, exponent
}
private int[][] transitionTable = {
{-1, 0, 3, 1, 2, -1},
{-1, 8, -1, 1, 4, 5},
{-1, -1, -1, 4, -1, -1}, // only accept digits
{-1, -1, -1, 1, 2, -1}, // similar as state 1, but cann't accept sign & space
{-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}
};
public boolean isNumber(String s) {
if (s == null || s.length() == 0) return false;
int state = 0;
for (int i = 0; i < s.length(); i++) {
int inputType = InputEnum.invalid.ordinal();
char curr = s.charAt(i);
if (curr == ' ')
inputType = InputEnum.space.ordinal();
else if (curr == '+' || curr == '-')
inputType = InputEnum.sign.ordinal();
else if (curr >= '0' && curr <= '9')
inputType = InputEnum.digit.ordinal();
else if (curr == '.')
inputType = InputEnum.dot.ordinal();
else if (curr == 'e' || curr == 'E')
inputType = InputEnum.exponent.ordinal();
state = transitionTable[state][inputType];
if (state == -1)
return false;
}
return state == 1 || state == 4 || state == 7 || state == 8;
}
}