剑指20:表示数值的字符串

传送门

nowcoder
leetcode

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如:字符串 “+100”, “5e2”, “-123”, “3.1416” 和 “-1E-16” 都表示数值。
但是 “12e”, “1a3.14”, “1.2.3”, “+-5” 和 “12e+4.3” 都不是。

C++ 代码 - nowcoder

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
27
28
29
/*
分情况讨论
*/
class Solution {
public:
bool isNumeric(string s) {
if (s.empty()) return false;
while (s.length() > 0 && s[0] == ' ') s.erase(0, 1);
while (s.length() > 0 && s[s.length() - 1] == ' ') s.erase(s.length() - 1, 1);
if (s.length() == 0) return false;

bool isDot = false, isE = false, isNumber = false;
for (int i = 0; i < s.length(); i ++) {
if (s[i] == ' ') return false;
else if (s[i] >= '0' && s[i] <= '9') isNumber = true;
else if (s[i] == 'e' || s[i] == 'E') {
if (isE || !isNumber || i == s.length() - 1) return false;
s[i] = 'e'; // 将'E'变成'e'
isE = true;
} else if (s[i] == '+' || s[i] == '-') {
if ((i > 0 && s[i - 1] != 'e') || (i == s.length() - 1)) return false;
} else if (s[i] == '.') {
if (isDot || isE || (i == s.length() - 1 && !isNumber)) return false;
isDot = true;
} else if (s[i] < '0' || s[i] > '9') return false; // 不合法字符
}
return true;
}
};

C++ 代码 - leetcode

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
分情况讨论
*/
class Solution {
public:
bool isNumber(string s) {
if (s.empty()) return false;
int i = 0;
while (i < s.size() && s[i] == ' ') i ++;
int j = s.size() - 1;
while (j >= 0 && s[j] == ' ') j --;
if (i > j) return false;
s = s.substr(i, j - i + 1);

bool hasSign = false, hasDot = false, hasE = false, hasNum = false; // 正负号/小数点/e/数字
int length = s.size();
for (int i = 0; i < length; i ++)
{
if (s[i] >= '0' && s[i] <= '9') hasNum = true;
else if (s[i] == 'e' || s[i] == 'E')
{
if (!hasNum) return false; // e前面没有数字
if (hasE) return false; // 只能有一个e
if (i == length - 1) return false; // e后面必须有数字,如 12e
hasE = true;
}
else if (s[i] == '+' || s[i] == '-')
{
// 第一次出现符号,并且不在开头,需要在e/E之后,如 12e+5
if (!hasSign && i > 0 && s[i - 1] != 'e' && s[i - 1] != 'E') return false;
// 第二次出现符号,需要在e/E之后,如 +5e-6
if (hasSign && s[i - 1] != 'e' && s[i - 1] != 'E') return false;
if (i == length - 1) return false;
hasSign = true;
}
else if (s[i] == '.')
{
if (hasDot) return false; // 小数点不能出现两次
if (hasE) return false; // E后面不能跟小数点,如 12e+4.3
if (i == length - 1 && !hasNum) return false; // E前面没有数字
hasDot = true;
}
else return false; // 不合法字符
}
return true;
}
};

剑指20:表示数值的字符串
https://lcf163.github.io/2021/01/30/剑指20:表示数值的字符串/
作者
乘风的小站
发布于
2021年1月30日
许可协议