0%

65. Valid Number

O(n) time O(1) space

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
bool isNumber(string s) {
bool exp = false, dot = false, num = false, numAfterE = false;
for (int i = s.find_first_not_of(' '); i <= s.find_last_not_of(' '); ++i) {
char c = s[i];
if (isdigit(c)) {
num = numAfterE = true;
} else if (c == 'e') {
if (exp || !num) return false;
exp = true;
numAfterE = false;
} else if (c == '.') {
if (dot || exp) return false;
dot = true;
} else if (c == '+' || c == '-') {
if (i > 0 && s[i - 1] != ' ' && s[i - 1] != 'e') return false;
} else return false;
}
return num && numAfterE;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
bool isNumber(string s) {
int n = s.length();
bool num = false, numAfterE = false, dot = false, exp = false, sign = false;
for (int i = 0; i < n; ++i) {
char c = s[i];
if (c == ' ') {
if ((num || dot || exp || sign) && i + 1 < n && s[i + 1] != ' ') return false; // 空格不能出现在中间
} else if (isdigit(c)) {
num = numAfterE = true;
} else if (c == '.') {
if (dot || exp) return false; // 不能有多个.且指数部分不能有.
dot = true;
} else if (c == 'e') {
if (exp || !num) return false; // 不能有多个e且e前必须得有数字出现
exp = true;
numAfterE = false; // 重置!!
} else if (c == '+' || c == '-') {
if (i > 0 && s[i - 1] != 'e' && s[i - 1] != ' ') return false; // 符号只能出现在最开始的空格之后或者e之后
sign = true;
} else return false;
}
return num && numAfterE; // 最后底数和指数都要检查
}
};