请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个
'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;
}
}
}
文章描述了一个使用有限状态自动机算法实现的函数,该函数用于判断给定的字符串是否符合数值的格式,包括整数、小数和科学计数法。作者提供了代码示例并展示了如何处理各种数值和非数值字符串.
198

被折叠的 条评论
为什么被折叠?



