您的位置:首页 > 其它

LeetCode Valid Number 有效数字(有限自动机)

2015-07-31 15:39 393 查看
题意:判断一个字符串是否是一个合法的数字,包括正负浮点数和整形。

思路:有限自动机可以做,画个图再写程序就可以解决啦,只是实现起来代码的长短而已。

  下面取巧来解决,分情况讨论:

(1)整数

(2)浮点数

(3)整数e整数

(4)浮点数e整数

  只有以上4种情况。但是要数之前可能带1个符号,这个可以直接过滤1个,而不影响结果。而且,其包含关系是从上到下扩展的,(1)扩展到(2),(3)扩展到 (4)。

  

  那么先解决符号 e 之前的,必须满足:正负号至多1个,有数字1个以上,点至多1个。

  如果没有e,那么可以结束了。若有e,跳过1个e,再继续。

  解决e后面的,必须满足:正负号至多1个,有数字1个以上,没有点。

class Solution {
public:
bool isNumber(string s) {
int i=0, d=0;
while( !s.empty() && s[s.size()-1]==' '  )       //直接删后缀空格
s.erase(s.end()-1);

while(i<s.size() && s[i]==' ')        //忽略前缀空格
i++;
if( s[i]=='+' || s[i]=='-' )  i++;      //这个符号出现了等于没出现

while(i<s.size() && isdigit(s[i]))
i++,d++;
if(i<s.size()&&s[i]=='.')   i++;
while(i<s.size() && isdigit(s[i]))
i++,d++;
if(!d)  return false;   //保证e之前不为空,且合法

//以上是e前的情况
if(i==s.size()) return true;
else if(s[i]!='e')  return false; //有e出现则e后不能空。无e则出错

//下面e后的情况
if(s[++i]=='+'||s[i]=='-')    i++;    //可以有符号

d=0;
while(i<s.size()&& isdigit(s[i]))       //只能出现整数了
i++,d++;
if(d && i==s.size()) return true;
else    return false;
}
};


AC代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: