65. Valid Number
验证给定的字符串是否可以解释为十进制数字。
例如:
"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”
正/负号 - “+”/"-"
小数点 - “.”
当然,在输入中,这些字符的上下文也很重要。
解题
列出所有字符可能出现的顺序:
res初始化为false;
只有当当前已得到字符满足数字条件时,res=true;
(1)开头为空格,忽略
(2)(可能出现)符号,if略过res=false;
(2)(必有)数字,while略过所有数字,res=true;
(3)(可能出现)小数点,if略过,res=false;——>(必有)数字,while掠过,res=true;
(4)(可能出现)e,if略过,res=false;——>(可能出现)符号,if略过,res=false;——>(必有)整数,while略过,res=true;
此时已经满足有所可能的数的表示;
(5)(可能出现)空格,while略过;
返回 i==n&&res;
若i!=n,说明结束后还有除了空格外别的字符;
class Solution {
public:
bool isNumber(string s) {
bool res=false;
int n=s.size();
int i=0;
//去除开头空格
while(i<n&&s[i]==' ') i++;
//数字前可能有符号
if(i<n&&(s[i]=='+'||s[i]=='-')) i++;
//读入数字
while(i<n&&s[i]>='0'&&s[i]<='9')
{
i++;
res=true;
}
//数字后可能有小数点
if(i<n&&s[i]=='.') { //小数点结尾算正确
i++;
}
//小数点后必须有小数
while(i<n&&s[i]>='0'&&s[i]<='9')
{
i++;
res=true;
}
//数字后面可能有e
if(res==1&&i<n&&s[i]=='e'){ //e前面为数字的情况下才能到这一步
i++;
res=false;
//e后面可能有符号
if(i<n&&(s[i]=='+'||s[i]=='-'))
i++;
//符号后面有整数
while(i<n&&s[i]>='0'&&s[i]<='9')
{
i++;
res=true;
}
//数字后已经结束
}
while(i<n&&s[i]==' ') i++;
return i==n&&res;
}
};