[LeetCode] 125: Valid Number

[Problem]

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.


[Analysis]

(1) 只有单个小数点,非法
(2) 小数点前面可以没有数字
(3) e的前面必须有数字
(4) e的后面必须有整数,可以有正负号,不能有小数点

[Solution]
class Solution {
public:
bool isNumber(const char *s) {
// Note: The Solution object is instantiated only once and is reused by each test case.
// remove heading blanks
while(*s == ' ')s++;
if(*s == '\0')return false;

// remove ending blanks
int len = strlen(s), end = len-1;
while(end >= 0 && s[end] == ' ')end--;

// positive_negative, point, e, positive_negative after e
bool num = false, pos = false, point = false, ee = false, eePos = false, eeNum = false;

for(int i = 0; i <= end; ++i){
// digit
if(isdigit(s[i])){
num = true; // number before point is done
pos = true; // pos of the number is done
if(ee){
eeNum = true; // number after e is done
eePos = true; // pos after e is done
}
}
// positive or negative
else if(s[i] == '-' || s[i] == '+'){
// positive or negative of the number
if(!pos){ // pos of the number have not been done
pos = true;
}
// positive or negative of the e part
else if(ee && !eePos){ // pos of the number have been done but pos after e not done
eePos = true;
}
// invalid
else{
return false;
}
}
// point
else if(s[i] == '.'){
pos = true; // pos of the number is done
if(!point && !ee){ // point before e have not been done, the point could only before e
point = true;
}
else{
return false;
}
}
// e
else if(s[i] == 'e'){
if(num && !ee){ // it must contains digits before e
ee = true;
}
else{
return false;
}
}
else{
return false;
}
}
if(!num || (ee && !eeNum))return false; // no digits in this number or no digits after e
return true;
}
};
说明:版权所有,转载请注明出处。 Coder007的博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值