Valid Number
题目:
- Validate if a given string is numeric.
- Some examples:
–“0” => true
–” 0.1 ” => true
–“abc” => false
–“1 a” => false
–“2e10” => true
思路:
- 有限状态机:清晰明了,网上资料较多,比较难以想到
- if-else,比较难理清楚多种情况,思路较为直接
1) 去掉字符串前后空格
2) 再进行判断
情况分类:
合法输入:
输入 | 限制条件 |
---|---|
. | 前面可有可无(有符号或无符号)数字;前面无数字的时候,后面必须跟无符号数字;前面无数字的时候,不是合法的结束;只能出现一次 |
e | 前后必须有(有符号或无符号)数字,后面的数字必须为整数;不是合法的结束;只能出现一次 |
数字 | 无,是合法结束 |
+、- | 只能出现在最开始,或者e后面;不是合法的结束 |
代码:
class Solution {
public:
void trim(string &s) // 去掉前后空格
{
if (s.empty())
{
return;
}
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
}
bool isNumber(string s) {
trim(s);
if (s.empty()) return false;
int i = 0;
// 判断点和e是否是第一次出现,以及判断是否出现过数字
bool isFirstP = 1, isFirste = 1, hasNum = 0;
while (i < s.length())
{
if ( (s[i] == '+' || s[i] == '-') && (i == 0 || (s[i-1] == 'e' && i != s.length() - 1)) )
{
i++;
continue;
}
if ( (s[i] >= '0' && s[i] <= '9') || (s[i] == '.' && isFirstP && isFirste && (i != s.length() - 1 || hasNum)) )
{
if (s[i] == '.') isFirstP = 0;
else
hasNum = 1;
i++;
continue;
}
else if (s[i] == 'e' && isFirste && hasNum && i != s.length() - 1)
{
isFirste = 0;
i++;
continue;
}
return false;
}
return true;
}
};