zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

表示数字的字符串


题目描述

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

解题思路

这和前面把字符串转换为整数的方法类似,添加了小数的判断和科学计数的部分判断。

若没有小数,和科学计数,则直接按照字符串转整数的方法判断。

若有'e','E'则后面的可以是 '+', '-'0~9的整数;

若有'.'则后面可以有'e','E'(它们后面的字符如上所示),和0~9的正整数组成;

但是我认为除了'+', '-'可以在前面,而'.', 'e', 'E'不能在最前面,或者紧跟在'+', '-'后面。不知道这样想对不对,反正这样写的代码没通过牛客网。出现 -.123应输出为true

代码

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
48
49
50
51
52
53
54
55
56
57
58
// 通过牛客网的代码

class Solution
{
public:
bool isNumeric (char* string)
{
// 判断非法输入
if (string == NULL || *string == '\0')
return false;

if (*string == '+' || *string == '-')
string++;

bool numeric = true; // 标志
scanDigits(&string); // 遍历0~9之间的数字,并跳过

if (*string != '\0')
{
if (*string == '.')
{
string++;
scanDigits(&string);
if (*string == 'e' || *string == 'E')
numeric = isExponential(&string);

}
else if (*string == 'e' || *string == 'E')
{
numeric = isExponential(&string);
}
else
numeric = false;
}
return numeric && *string == '\0';
}

private:

// 跳过0~9的数字
void scanDigits(char** string)
{
while (**string != '\0' && **string >= '0' && **string <= '9')
(*string)++; // 注意后缀++优先级高于解指针*
}

// 判断'e' 'E'后面的字符
bool isExponential (char** string)
{
(*string)++;
if (**string == '\0')
return false;
if (**string == '+' || **string == '-')
(*string)++;
scanDigits(string);
return (**string == '\0') ? true : false;
}
};

参考博文链接:https://cuijiahua.com/blog/2018/01/basis_53.html

文章作者:zerofly

发布时间:2020年06月05日 - 10:06

原始链接:http://zeroflycui.github.io/3347c86f.html

许可协议: 转载请保留原文链接及作者。