剑指offer——20. 表示数值的字符串

20. 表示数值的字符串

NowCoder

题目描述

1
2
3
4
5
6
7
true

"+100"
"5e2"
"-123"
"3.1416"
"-1E-16"
1
2
3
4
5
6
7
false

"12e"
"1a3.14"
"1.2.3"
"+-5"
"12e+4.3"

解题思路

使用正则表达式进行匹配。

1
2
3
4
5
6
7
8
[]  : 字符集合
() : 分组
? : 重复 0 ~ 1 次
+ : 重复 1 ~ n 次
* : 重复 0 ~ n 次
. : 任意字符
\\. : 转义后的 .
\\d : 数字
1
2
3
4
5
public boolean isNumeric(char[] str) {
if (str == null || str.length == 0)
return false;
return new String(str).matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");
}

我的做法:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
分情况讨论
1、去空格
2、去首字母 + -
2、排除非法情况
非法数据 0-9 e/E . + -
a、首位再次出现+-
b、当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
c\当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4; 不能出现.
d\只能出现
e\小数点的个数 e的最多一个 右边不能有

//牛客
bool isNumeric(char* string)
{
std::string s = string;

*/

class Solution {
public:
bool isNumber(string s) {
if(s.empty()) return false;

//出空格
int i = 0, j = s.size() - 1;
while(s[i] == ' ' && i < s.size()) i ++;
while(s[i] == ' ' && j >= 0) j --;
if(i > j) return false;
s = s.substr(i, j - i + 1);

//去首字母 + -
if(s[0] == '+' || s[0] == '-')
{
if(s.size() <=1) return false;
s = s.substr(1);
}
if(s[0] == '+' || s[0] == '-' || s[0] == '.' && s.size() <=1) return false; //多个符号 并且只有 一个点

//定义符号数据 e . e后面的+—符号
int eNums = 0, dotNums = 0, e_signNums = 0;
//排除非法情况
for(int i = 0; i < s.size(); i ++)
{

//cout << "sss1" << endl;

//非法字符判断 0-9 +- .
if(s[i] != '+' && s[i] != '-' && s[i] != '.' && s[i] != 'e' && s[i] != 'E' && !(s[i] >= '0' && s[i] <= '9')) return false;

//.e1、e1
if(s[i] == 'e' || s[i] == 'E')
{
//cout << "sss3" << endl;
eNums ++; if(eNums > 1) return false;
if(i == 0 || i == 1 && s[0] == '.' || i == s.size() - 1 ) return false; //例如.e1、e1;12e e+
//cout << "sss3" <<eNums << i << endl;
}

//cout << "sss2" << endl;
//小数点最多有一个 1.2.3 //e 后面的 12e+5.4 //允许 .12 233. //单独一个 '.'
if(s[i] == '.')
{
dotNums ++;
if(dotNums > 1 || dotNums == 1 && (eNums == 1 || s.size() <=1 )) return false;
}

//符号 因为排除了最开始的情况 所以符号数最多为1 且只能在e之后 5+4
if(s[i] == '+' || s[i] == '-')
{
e_signNums ++;
if(e_signNums > 1 || e_signNums == 1 && eNums <= 0 || eNums == 1 && i == s.size() - 1 ) return false; //e+
}
}

return true;
}
};
创作不易,欢迎打赏!
-------------本文结束感谢您的阅读-------------