# 有效数字
有效数字(按顺序)可以分成以下几个部分:
- 一个 小数 或者 整数
- (可选)一个
'e'
或 'E'
,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或 '-'
) - 下述格式之一:
- 至少一位数字,后面跟着一个点
'.'
- 至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字 - 一个点
'.'
,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或 '-'
) - 至少一位数字
部分有效数字列举如下:
["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:
["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s
,如果 s
是一个 有效数字 ,请返回 true
。
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
示例 4:
输入:s = ".1"
输出:true
提示:
1 <= s.length <= 20
s
仅含英文字母(大写和小写),数字(0-9
),加号 '+'
,减号 '-'
,或者点 '.'
。
以下错误的选项是?
## aop
### before
```c
#include
using namespace std;
```
### after
```c
int main()
{
Solution sol;
string s = ".1";
bool res;
res = sol.isNumber(s);
cout << res;
return 0;
}
```
## 答案
```c
class Solution
{
public:
bool isNumber(string s)
{
int len = s.size();
int left = 0, right = len - 1;
bool eExisted = false;
bool dotExisted = false;
bool digitExisited = false;
while (s[left] == ' ')
++left;
while (s[right] == ' ')
--right;
if (left >= right && (s[left] < '0' || s[left] > '9'))
return false;
if (s[left] == '.')
dotExisted = true;
else if (s[left] >= '0' && s[left] <= '9')
digitExisited = true;
else if (s[left] != '+' && s[left] != '-')
return false;
for (int i = left + 1; i <= right - 1; ++i)
{
if (s[i] >= '0' && s[i] <= '9')
digitExisited = true;
else if (s[i] == 'e' || s[i] == 'E')
{
if (!eExisted && s[i - 1] != '+' && s[i - 1] != '-' && digitExisited)
eExisted = true;
else
return false;
}
else if (s[i] == '+' || s[i] == '-')
{
if (s[i - 1] != 'e' && s[i - 1] != 'E')
return false;
}
else if (s[i] == '.')
{
if (!dotExisted && !eExisted)
dotExisted = true;
else
return false;
}
else
return false;
}
if (s[right] >= '0' && s[right] <= '9')
return true;
else
return false;
}
};
```
## 选项
### A
```c
class Solution
{
public:
bool isInt(string &s, int &index)
{
if (index < s.size() && (s[index] == '-' || s[index] == '+'))
index++;
return isUnsigned(s, index);
}
bool isUnsigned(string &s, int &index)
{
int pre = index;
while (index < s.size())
{
if (s[index] >= '0' && s[index] <= '9')
index++;
else
break;
}
return index > pre;
}
bool isNumber(string s)
{
if (s.empty())
{
return false;
}
int index = 0;
while (index < s.size() && s[index] == ' ')
{
index++;
}
bool ans = isInt(s, index);
if (index < s.size() && s[index] == '.')
{
index++;
ans = isUnsigned(s, index) || ans;
}
if (index < s.size() && s[index] == 'e')
{
index++;
ans = isInt(s, index) && ans;
}
while (index < s.size() && s[index] == ' ')
{
index++;
}
return ans && index == s.size();
}
};
```
### B
```c
class Solution
{
public:
bool isNumber(string s)
{
int tail = s.size() - 1;
int head = 0;
while (tail >= 0)
{
if (s[tail] == ' ')
--tail;
else
break;
}
while (head <= tail)
{
if (s[head] == ' ')
++head;
else
break;
}
if (head > tail)
return false;
s = s.substr(head, tail - head + 1);
int index = s.find('e');
if (index == string::npos)
return judgea(s);
else
return judgea(s.substr(0, index)) && judgeb(s.substr(index + 1));
}
bool judgea(string s)
{
bool have_num = false;
bool have_pointed = false;
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9')
have_num = true;
else if (s[i] == '+' || s[i] == '-')
{
if (i != 0)
return false;
}
else if (s[i] == '.')
{
if (have_pointed)
return false;
have_pointed = true;
}
else
return false;
}
return have_num;
}
bool judgeb(string s)
{
bool have_num = false;
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9')
have_num = true;
else if (s[i] == '-' || s[i] == '+')
{
if (i != 0)
return false;
}
else
return false;
}
return have_num;
}
};
```
### C
```c
class Solution
{
public:
bool isNumber(string s)
{
bool num = false, numAfterE = true, dot = false, sign = false, exp = false;
int n = s.size();
for (int i = 0; i < n; ++i)
{
if (s[i] == ' ')
{
if (i < n - 1 && s[i + 1] != ' ' && (num || dot || sign || exp))
return false;
}
else if (s[i] == '+' || s[i] == '-')
{
if (i > 0 && s[i - 1] != 'e' && s[i - 1] != ' ')
return false;
sign = true;
}
else if (s[i] >= '0' && s[i] <= '9')
{
num = true;
numAfterE = true;
}
else if (s[i] == '.')
{
if (dot || exp)
return false;
dot = true;
}
else if (s[i] == 'e')
{
if (exp || !num)
return false;
exp = true;
numAfterE = false;
}
else
return false;
}
return num && numAfterE;
}
};
```