题目简介:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”、”5e2”、”-123”、”3.1416”、”-1E-16”、”0123”都表示数值,但”12e”、”1a3.14”、”1.2.3”、”+-5”及”12e+5.4”都不是。
思路:
考虑的情况是真的多,有点头疼。
- 只能出现一个
e
,并且e
前面和后面都得有数字,并且e
之后可以重置+, -, .
,即在满足其他要求的情况下,这些符号又可以出现。
.
前面不能有., e
。
- 操作符前面不能有操作符,不能有数字,不能有点(除非被重置)。
- 遇到其他符号直接返回
false
。
- 除了最前面和最后面可以有连续的空格外,中间部分不能有空格。
tip:
代码如下:
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; flag_dot = false; flag_op = false; }
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(); } };
|