您的位置:首页 > 其它

[LeetCode] 125: Valid Number

2017-09-10 20:53 447 查看
[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的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: