一、语言规则
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
- 若干空格
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(’+’ 或 ‘-’)
- 下述格式之一:
至少一位数字,后面跟着一个点 ‘.’
至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
一个点 ‘.’ ,后面跟着至少一位数字整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(’+’ 或 ‘-’)
- 至少一位数字
注意:
1. 0开头的整数被视为合法
4. 指数e/E后 只能跟整数
5. 注意处理小数的三种格式
二、有限状态机
三、编程思路
注:可选情况不满足不返回false ,必须情况不满足及时返回false
- 处理空格(可选)
- 处理+/-(可选)
- 分割整数/小数——字符串寻找是否包含’.’(二选一)
- 处理整数——0~9组成(必须)
- 处理小数——0~9 . 0~9 组成,其中,可以无前,或无后(必须)
- 处理指数——e/E后 跟 符号+整数(可选)
- 处理空格(可选)
- 处理单个或多个空格(可选)
if (s[i] == ' ') {//空格
i++;
while (s[i] == ' ')
i++;
}
- 处理单个 + / -(可选)
if (s[i] == '-' || s[i] == '+')//符号
i++;
- 分割整数和小数——字符串寻找是否包含’.’
if (s.find('.')!=string::npos) {
//小数
}
else{
//整数
}
- 处理整数——单个或多个0~9组成(必须)
if (isdigit(s[i])) {
i++;
while (isdigit(s[i]))
i++;
}
else
return false;
- 处理小数——0~9 . 0~9 ,其中可
.0~9
或0~9.
(必须)
if (isdigit(s[i])) {//.前面有数字
i++;
while (isdigit(s[i]))
i++;
if (s[i] == '.') {
i++;
while (isdigit(s[i]))
i++;
}//数字后不是紧跟. 返回false
else
return false;
}
else if (s[i] == '.') {//.前面无数字
i++;
if (isdigit(s[i])) {
i++;
while (isdigit(s[i]))
i++;
}
else//.前面无数字后面也无数字返回false
return false;
}
else
return false;
- 处理指数——e/E后 跟 符号整数(可选)
if (s[i] == 'e' || s[i] == 'E') {//指数
i++;
if (s[i] == '-' || s[i] == '+')//符号
i++;
if (isdigit(s[i])) {//整数
i++;
while (isdigit(s[i]))
i++;
}
else//e/E后面未跟整数 返回false
return false;
}
- 处理空格(可选)
if (s[i] == ' ') {//空格
i++;
while (s[i] == ' ')
i++;
}
四、代码整合
#include <iostream>
using namespace std;
class Solution {
bool isdigit(char c) {
return c >= '0' && c <= '9';
}
public:
bool isNumber(string s) {
int i = 0;
if (s[i] == ' ') {//空格
i++;
while (s[i] == ' ')
i++;
}
if (s[i] == '-' || s[i] == '+')//符号
i++;
if (s.find('.')!=string::npos) {//小数
if (isdigit(s[i])) {//.前面有数字
i++;
while (isdigit(s[i]))
i++;
if (s[i] == '.') {
i++;
while (isdigit(s[i]))
i++;
}
else
return false;
}
else if (s[i] == '.') {//.前面无数字
i++;
if (isdigit(s[i])) {
i++;
while (isdigit(s[i]))
i++;
}
else
return false;
}
else
return false;
}
else {//整数
if (isdigit(s[i])) {
i++;
while (isdigit(s[i]))
i++;
}
else
return false;
}
if (s[i] == 'e' || s[i] == 'E') {//指数
i++;
if (s[i] == '-' || s[i] == '+')//符号
i++;
if (isdigit(s[i])) {//整数
i++;
while (isdigit(s[i]))
i++;
}
else
return false;
}
if (s[i] == ' ') {//空格
i++;
while (s[i] == ' ')
i++;
}
if (i == s.size())
return true;
else
return false;
}
};
五、测试用例
int main(){
Solution test;
cout << "正例" << endl;
cout << test.isNumber("0123") << endl;//整数
cout << test.isNumber("123.") << endl;//小数
cout << test.isNumber("+.12") << endl;//小数
cout << test.isNumber("+13.56") << endl;//小数
cout << test.isNumber("-3.1415e12 ") << endl;//指数
cout << test.isNumber(" 3415E+12") << endl;//指数
cout << "反例" << endl;
cout << test.isNumber("+-0123") << endl;
cout << test.isNumber("123.a") << endl;
cout << test.isNumber("+..12") << endl;
cout << test.isNumber("1+3.e056") << endl;
cout << test.isNumber(".") << endl;
}