领扣 65. 有效数字
程序员文章站
2022-05-20 13:52:32
...
验证给定的字符串是否为数字。
例如:
“0” => true
" 0.1 " => true
“abc” => false
“1 a” => false
“2e10” => true
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。
我的提交 28ms
bool deal_blank(int i,string &s)
{
for(i=i+1;i<s.length();i++)
if(s[i]!=' ') return false;
return true;
}
bool deal_e(int j,string &s)
{
if(j+1==s.length()) return false;
else
{
if(s[j+1]=='-'||s[j+1]=='+')
{
if(j+2==s.length()) return false;
else
j++;
}
if(s[j+1]==' ') return false;
for(j=j+1;j<s.length();j++)
{
if(!(s[j]>='0'&&s[j]<='9'))
{
if(s[j]==' ')
return deal_blank(j,s);
return false;
}
}
return true;
}
}
bool deal_point(int i,string &s)
{
for(int j=i+1;j<s.length();j++)
{
if(!(s[j]>='0'&&s[j]<='9'))
{
if(s[j]==' ')
return deal_blank(j,s);
if(s[j]=='e'||s[j]=='E')
return deal_e(j,s);
return false;
}
}
return true;
}
class Solution {
public:
bool isNumber(string s) {
if(s.length()==0) return false;
int i=0;
if(s[0]==' ')
{
for(;i<s.length();i++)
{
if(s[i]!=' ') break;
}
}
if(s[i]=='-'||s[i]=='+')
{
if(s.length()==i+1) return false;
else
i++;
}
if(s[i]>='0'&&s[i]<='9')
{
if(s.length()==i+1) return true;
else
{
for(i=i+1;i<s.length();i++)
{
if(!(s[i]>='0'&&s[i]<='9'))
{
if(s[i]==' ')
return deal_blank(i,s);
if(s[i]=='.')
return deal_point(i,s);
if(s[i]=='e'||s[i]=='E')
return deal_e(i,s);
return false;
}
}
return true;
}
}
else if(s[i]=='.')
{
if(s.length()==i+1) return false;
if(!(s[i+1]>='0'&&s[i+1]<='9')) return false;
return deal_point(i,s);
}
else
return false;
}
};
网上发现的精简版本 28ms
所有的字符可以分为六大类,空格,符号,数字,小数点,自然底数和其他字符,我们需要五个标志变量,num, dot, exp, sign分别表示数字,小数点,自然底数和符号是否出现,numAfterE表示自然底数后面是否有数字,那么我们分别来看各种情况:
-
空格: 我们需要排除的情况是,当前位置是空格而后面一位不为空格,但是之前有数字,小数点,自然底数或者符号出现时返回false。
-
符号:符号前面如果有字符的话必须是空格或者是自然底数,标记sign为true。
-
数字:标记num和numAfterE为true。
-
小数点:如果之前出现过小数点或者自然底数,返回false,否则标记dot为true。
-
自然底数:如果之前出现过自然底数或者之前从未出现过数字,返回false,否则标记exp为true,numAfterE为false。
-
其他字符:返回false。
最后返回num && numAfterE即可。
class Solution {
public:
bool isNumber(string s) {
bool num = false, numAfterE = true, dot = false, exp = false, sign = false;
int n = s.size();
for (int i = 0; i < n; ++i) {
if (s[i] == ' ') {
if (i < n - 1 && s[i + 1] != ' ' && (num || dot || exp || sign)) return false;
} else if (s[i] == '+' || s[i] == '-') {
if (i > 0 && s[i - 1] != 'e' && s[i - 1] != ' ') return false;
sign = true;
} else if (s[i] >= '0' && s[i] <= '9') {
num = true;
numAfterE = true;
} else if (s[i] == '.') {
if (dot || exp) return false;
dot = true;
} else if (s[i] == 'e') {
if (exp || !num) return false;
exp = true;
numAfterE = false;
} else return false;
}
return num && numAfterE;
}
};
上一篇: 领扣 72. 编辑距离
推荐阅读