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.
I think it's hard to finish such a problem during the interview because the conditions are not complete. This problem is just a kidding.
class Solution {
public:
bool isNumber(const char *s) {
// Note: The Solution object is instantiated only once and is reused by each test case.
bool isSpaceExist = false;
bool isDotExist = false;
bool isSignExist[2] = {false, false};
bool iseExist = false;
bool isePartExist[2]= {false, false};
while (*s) {
if (*s == '+' || *s == '-') {
if (!iseExist) {
if (isePartExist[0] || isSignExist[0] || isDotExist || isSpaceExist)
return false;
else
isSignExist[0] = true;
}
else {
if (isePartExist[1] || isSignExist[1] || isSpaceExist)
return false;
else
isSignExist[1] = true;
}
}
else if (*s >= '0' && *s <= '9'){
if (isSpaceExist)
return false;
else {
if (!iseExist)
isePartExist[0] = true;
else
isePartExist[1] = true;
}
}
else if (*s == ' ') {
if ((isePartExist[0] == false) && (isSignExist[0] || isDotExist))
return false;
else if (isePartExist[0])
isSpaceExist = true;
}
else if (*s == 'e' || *s == 'E') {
if (!isePartExist[0] || iseExist || isSpaceExist)
return false;
else
iseExist = true;
}
else if (*s == '.') {
if (isDotExist || iseExist || isSpaceExist)
return false;
else
isDotExist = true;
}
else
return false;
s++;
}
if (iseExist && !isePartExist[1])
return false;
if (!isePartExist[0])
return false;
return true;
}
};
有限状态机实现,以下转载自:https://blog.youkuaiyun.com/kenden23/article/details/18696083
class Solution {
public:
bool isNumber(const char *s) {
enum InputType {
INVALID, // 0 Include: Alphas, '(', '&' ans so on
SPACE, // 1
SIGN, // 2 '+','-'
DIGIT, // 3 numbers
DOT, // 4 '.'
EXPONENT, // 5 'e' 'E'
};
int transTable[][6] = {
//0INVA,1SPA,2SIG,3DI,4DO,5E
-1, 0, 3, 1, 2, -1,//0初始无输入或者只有space的状态
-1, 8, -1, 1, 4, 5,//1输入了数字之后的状态
-1, -1, -1, 4, -1, -1,//2前面无数字,只输入了Dot的状态
-1, -1, -1, 1, 2, -1,//3输入了符号状态
-1, 8, -1, 4, -1, 5,//4前面有数字和有dot的状态
-1, -1, 6, 7, -1, -1,//5'e' or 'E'输入后的状态
-1, -1, -1, 7, -1, -1,//6输入e之后输入Sign的状态
-1, 8, -1, 7, -1, -1,//7输入e后输入数字的状态
-1, 8, -1, -1, -1, -1,//8前面有有效数输入之后,输入space的状态
};
int state = 0;
while (*s)
{
InputType input = INVALID;
if (*s == ' ') input = SPACE;
else if (*s == '+' || *s == '-') input = SIGN;
else if (isdigit(*s)) input = DIGIT;
else if (*s == '.') input = DOT;
else if (*s == 'e' || *s == 'E') input = EXPONENT;
state = transTable[state][input];
if (state == -1) return false;
++s;
}
return state == 1 || state == 4 || state == 7 || state == 8;
}
};