题目描述
验证给定的字符串是否可以解释为十进制数字。
例如:
"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"
- 正/负号
"+"/"-"
- 小数点
"."
当然,在输入中,这些字符的上下文也很重要。
当然,在输入中,这些字符的上下文也很重要。
更新于 2015-02-10:
C++
函数的形式已经更新了。如果你仍然看见你的函数接收 const char *
类型的参数,请点击重载按钮重置你的代码。
算法分析
一道很难的模拟题,细节特别多
- 1、去掉前后空格
- 2、
e
的前后是空,则返回false
- 3、
e
后面不能是"."
- 4、正负号 不能连续出现多余
1
个 - 5、
e
和"."
最多1
个 - 6、正负号后面不能是空
具体详细版的看y总的视频
时间复杂度 $O(n)$
Java 代码
class Solution {
public boolean isNumber(String s) {
int l = 0,r = s.length() - 1;
while(l <= r && s.charAt(l) == ' ') l ++;
while(l <= r && s.charAt(r) == ' ') r --;
if(l > r) return false;
s = s.substring(l,r + 1);
if(s.charAt(0) == '+' || s.charAt(0) == '-') s = s.substring(1);
if(s.length() == 0) return false;
if(s.charAt(0) == '.' && (s.length() == 1 || s.charAt(1) == 'e' || s.charAt(1) == 'E'))
return false;
int dot = 0,e = 0;//dot表示小数点个数,e表示e的个数
for(int i = 0;i < s.length();i ++)
{
if(s.charAt(i) == '.')
{
if(dot > 0 || e > 0) return false;
dot ++;
}else if(s.charAt(i) == 'e' || s.charAt(i) == 'E')
{
if(i == 0 || i + 1 == s.length() || e > 0) return false;
if(s.charAt(i + 1) == '+' || s.charAt(i + 1) == '-')
{
if(i + 2 == s.length()) return false;
i ++;
}
e ++;
}else if(s.charAt(i) < '0' || s.charAt(i) > '9') return false;
}
return true;
}
}