请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个
'e'
或'E'
,后面跟着一个 整数 - 若干空格
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 下述格式之一:
- 至少一位数字,后面跟着一个点
'.'
- 至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字 - 一个点
'.'
,后面跟着至少一位数字
- 至少一位数字,后面跟着一个点
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
我采用有限状态自动机,根据当前状态,读入的字符来决定下一个状态。思路简单,步骤繁琐。
其他可供参考的思路:正则表达式,实际上本身正则语言的识别是通过有限状态自动机实现的。
有限状态自动机图示
代码实现如下
class Solution {
public boolean isNumber(String string) {
Scanner scanner = new Scanner(System.in);
int cur_state = 1;
for(int i = 0;i < string.length();i ++)
{
cur_state = state(cur_state,string.charAt(i));
if(cur_state == -1)
{
break;
}
}
if(cur_state == 3 || cur_state == 5 ||cur_state == 6 || cur_state == 8 || cur_state == 9)
{
return true;
}
else
{
return false;
}
}
public static int state(int cur_state, char cur_char)//输入当前状态,下一个字符,返回下一个状态
{
if(cur_state == 1)
{
if(cur_char == ' ')//如果是空格保持当前状态
{
return 1;
}
else if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 3;
}
else if(cur_char == '+' || cur_char == '-')
{
return 2;
}
else if(cur_char == '.')
{
return 10;
}
else
{
return -1;
}
}
else if(cur_state == 2)
{
if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 3;
}
else if(cur_char == '.')
{
return 10;
}
else
{
return -1;
}
}
else if(cur_state == 3)
{
if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 3;
}
else if(cur_char == '.')
{
return 6;
}
else if(cur_char == 'E' || cur_char == 'e')
{
return 4;
}
else if(cur_char == ' ')
{
return 9;
}
else
{
return -1;
}
}
else if(cur_state == 4)
{
if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 5;
}
else if(cur_char == '+' || cur_char == '-')
{
return 7;
}
else
{
return -1;
}
}
else if(cur_state == 5)
{
if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 5;
}
else if(cur_char == ' ')
{
return 9;
}
else
{
return -1;
}
}
else if(cur_state == 6)
{
if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 8;
}
else if(cur_char == ' ')
{
return 9;
}
else if(cur_char == 'E' || cur_char == 'e')
{
return 4;
}
else
{
return -1;
}
}
else if(cur_state == 7)
{
if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 5;
}
else
{
return -1;
}
}
else if(cur_state == 8)
{
if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 8;
}
else if(cur_char == ' ')
{
return 9;
}
else if(cur_char == 'E' || cur_char == 'e')
{
return 4;
}
else
{
return -1;
}
}
else if(cur_state == 9)
{
if(cur_char == ' ')
{
return 9;
}
else
{
return -1;
}
}
else if(cur_state == 10)
{
if(cur_char - '0' >= 0 && cur_char - '9' <= 0)
{
return 8;
}
else
{
return -1;
}
}
else
{
return -1;
}
}
}