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.
这道题有些难,主要是需要考虑的情况比较多,如果一次次加条件进行约束,比较繁琐,难以顾及到所有的情况,参考了一些博客,比较舒服的做法是有限状态机的思想,在此感谢http://blog.csdn.net/suwei19870312/article/details/12094233以及http://www.cnblogs.com/zuoyuan/p/3703075.html
说到有限状态机就需要知道,有几种状态可以进行转移。
首先,可输入的字符有6种情况,用0~5来表示
0:无效的字符,{},abc...
1 : 空格
2 : 符号 +/-
3 : 数字 0~9
4 : 小数点 .
5 : 指数 e/E
这五种输入对应有9种可转移的状态,输入一个字符可能处于以下几种状态
0:初始状态,无输入或者是空格
1:数字
2:点
3:符号
4:数字+点/ 点+数字
5:e/E
6:e/E+符号
7:e/E+数字
8:有效输入+空格
对应转移矩阵
int trans[][6] = {
-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
};
最终可以接受的状态为1,4,7,8,代码如下:
class Solution {
public:
bool isNumber(string s)
{
//定义枚举类型,列举输入字符的几种可能性
enum InputType
{
invalid = 0,
space = 1,
sign = 2,
num = 3,
dot = 4,
exponent=5
};
//定义状态转移矩阵
int trans[][6] = {
-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
};
//初始状态
int state = 0;
int n = s.size();
int i = 0;
int step;
while (i < n)
{
if (s[i] == ' ')
step = space;
else if (s[i] == '+' || s[i] == '-')
step = sign;
else if (s[i] >= '0'&&s[i] <= '9')
step = num;
else if (s[i] == '.')
step = dot;
else if (s[i] == 'e' || s[i] == 'E')
step = exponent;
else
step = invalid;
state = trans[state][step];
if (state == -1)
return false;
else
i++;
}
if (state == 1 || state == 4 || state == 7 || state == 8)
return true;
else
return false;
}
};