0%

LeetCode-No-65

有效数字

验证给定的字符串是否可以解释为十进制数字。

例如:

"0" = true " 0.1 " = true "abc" = false "1 a" = false "2e10" = true " -90e3   " = true " 1e" = false "e3" = false " 6e-1" = true " 99e2.5 " = false "53.5e93" = true " --6 " = false "-+3" = false "95a54e53" = false

说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:

数字 0-9 指数 - "e" 正/负号 - "+"/"-" 小数点 - "." 当然,在输入中,这些字符的上下文也很重要。

题目分析

  1. 这题我感觉是一种代码实现问题,考查考虑问题是否全面? 没有什么特别的算法思想,想清楚判定数字的流程,然后一路判断下来即可。但是要实现你原计划的流程,还是要好好打理一下自己的代码。

  2. 字符特征 : 2.1 可能包含”0~9“,”e“,”.“,“+”,“-”,” “。 2.2 ”e” 允许出现的次数?还要考虑“e”后是否允许出现”." , ”+“,”-“?是否允许作为开头结尾?前面是否一定要有数字? 2.3 “." 允许出现的次数? ”." 后是否允许出现 “e" , "+ " ,"- "?是否允许作为开头结尾 ?前面是否一定要有数字? 2.4 ”+“ ,”-“,最多出现两次,一次在幂,一次在指数,且一定位于其他符号之前,且不能作为结尾 2.5 ”0~9“ ,”0“是否允许在幂 或者 指数 或者 小数部分 的首部,是否允许”0“结尾的小数部分。 2.6 ” “,只能作为开头结尾。 2.7 整个数,必须要有数字出现。

  3. 判断流程 3.1 数前空格清除 3.2 首位判断+ - 号,然后进入幂部分/整数部分 3.3 正常判断数字,遇到 ”." 进入小数部分,“e” 进入指数部分,其余false。 3.4.1 小数部分,标记小数点已经用过,不能再出现,其余照常。 3.4.2 指数部分,检查e前是否有数字,”+“ ”-“可以再用,重置”+-“的标志位,小数点不能用了,小数点标志位置false,当然e也不能再用了。继续照常检查数字。 3.5 检查到” “,” “只能作为末尾出现,因此直接跳出主体循环,进入尾部判断环节。 3.6 数的结尾检查,不能是”e", "+ " "-" ,但可以是“ . ”。 3.7尾部清洗,一路检查是否是“ ”,遇到个不是的则false。 3.8 检查全部通过,但它也要有数字才可能是数!return HasNum;

题解代码

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
79
80
81
82
83
84
85
86
87
88
89
class Solution {
public:
bool isNumber(string s)
{ //0开头结尾 true
//多个e false
//e左右两边要有数
//指数不能为小数
int i=0;
bool UsedSign=false;
bool UsedCom=false;
bool UsedExp=false;
bool HasNum=false;
//首部空格清除
while(i<s.size())
{
if(s[i]!=' ')
break;
i++;
}

//首位判断符号位
if(i<s.size() && (s[i]=='+' || s[i]=='-') )//符号
{
UsedSign=true;
i++;
}



//主体判断
for(;i<s.size();i++)
{
if(s[i]='0' && s[i]<='9')
{
HasNum=true;
continue;
}
else if(s[i]=='+' || s[i]=='-')//主要用来判断指数的符号
{
if(UsedSign==false && s[i-1]=='e')
{
UsedSign=true;
continue;
}
else
return false;
}
else if(s[i]=='.')//小数点
{
if(UsedCom==false)
{
UsedCom=true;
continue;
}
else
return false;
}
else if(s[i]=='e')//指数符号
{
if(UsedExp==false && HasNum==true) //e前需有数字
{
UsedExp=true;
UsedSign=false;//重置符号状态位,指数也可以带符号
UsedCom=true;//指数不能是小数
continue;

}
else
return false;
}
else if(s[i]==' ') //尾部空格
break;
else
return false;
}

if(s[i-1]=='e' ||s[i-1]=='+' || s[i-1]=='-')//e + -结尾 不行
return false;

while(i<s.size())//尾部空格清除
{
if(s[i]!=' ')
return false;
i++;
}

return HasNum;
}
};