Keshawn_lu's Blog

Leetcode 剑指 Offer 20. 表示数值的字符串

字数统计: 395阅读时长: 1 min
2020/09/02 Share

题目简介:

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

思路:

考虑的情况是真的多,有点头疼。

  1. 只能出现一个e,并且e前面和后面都得有数字,并且e之后可以重置+, -, .,即在满足其他要求的情况下,这些符号又可以出现。
  2. .前面不能有., e
  3. 操作符前面不能有操作符,不能有数字,不能有点(除非被重置)。
  4. 遇到其他符号直接返回false
  5. 除了最前面和最后面可以有连续的空格外,中间部分不能有空格。

tip:

  • 难点就在各种情况的判断以及遇到e后的重置操作。

代码如下:

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 isNumber(string s) {

int pos = 0;

while(pos < s.size() && s[pos] == ' ')
pos++; //跳过开头空格

bool flag_num = false;
bool flag_e = false;
bool flag_dot = false;
bool flag_op = false;

while(pos < s.size()){

if(s[pos] == ' ')
break;

else if(s[pos] >= '0' && s[pos] <= '9')
flag_num = true;

else if(s[pos] == 'e' || s[pos] == 'E'){

if(flag_e || !flag_num)
return false;
flag_e = true;

flag_num = false; //e后面必须得有数字
flag_dot = false; //重置"."
flag_op = false; //重置op, 后面可以继续跟操作符
}

else if(s[pos] == '.'){

if(flag_dot || flag_e)
return false;
flag_dot = true;
}

else if(s[pos] == '+' || s[pos] == '-'){

if(flag_op || flag_num || flag_dot)
return false;
flag_op = true;
}
else
return false;

pos++;
}

while(pos < s.size() && s[pos] == ' ')
pos++; //跳过后置空格

return flag_num && pos == s.size();
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: