[Problem]
[Analysis]
(1) 只有单个小数点,非法
(2) 小数点前面可以没有数字
(3) e的前面必须有数字
(4) e的后面必须有整数,可以有正负号,不能有小数点
[Solution]
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 {说明:版权所有,转载请注明出处。 Coder007的博客
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;
}
};