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.
Update (2015-02-10):
The signature of the C++
function had been updated. If you still see your function signature accepts a const char *
argument, please click the reload button to reset your code definition.
题意
判断一个字符串是否表示一个数字。
题解
细节题,须考虑输入的各种情形。
输入分为6种情况:无效输入、空格、+-号、数字、点、e
根据这六种情况作一个状态转移矩阵
const int transitionTable[][NUM_INPUTS] = { |
19 | -1, -1, -1, 4, -1, -1, |
23 | -1, -1, -1, 7, -1, -1, |
25 | -1, 8, -1, -1, -1, -1, |
其中最好合法的结果是1、4、7、8
另:本题的功能与标准库中的{strtod()}功能类似。如果已经懂了原理,可以用这个函数加快解题。
class Solution {
public:
bool isNumber(string s) {
enum InputType{
INVALID, //代表不正确
SPACE, // 代表空格
SIGN, // 代表符号
DIGIT,
DOT, //代表点符号
EXPONENT, //代表科学计算
NUM_INPUTS //输入状态个数
};
int transitionTable[][NUM_INPUTS] =
{
-1, 0, 3, 1, 2, -1, // next states for state 0
-1, 8, -1, 1, 4, 5, // next states for state 1
-1, -1, -1, 4, -1, -1, // next states for state 2
-1, -1, -1, 1, 2, -1, // next states for state 3
-1, 8, -1, 4, -1, 5, // next states for state 4
-1, -1, 6, 7, -1, -1, // next states for state 5
-1, -1, -1, 7, -1, -1, // next states for state 6
-1, 8, -1, 7, -1, -1, // next states for state 7
-1, 8, -1, -1, -1, -1, // next states for state 8
};
int state=0;
for(auto cur=&s[0];*cur!='\0';cur++)
{
InputType input=INVALID;
if(isspace(*cur)) input=SPACE;
else if(*cur=='+'||*cur=='-') input=SIGN;
else if(isdigit(*cur)) input=DIGIT;
else if(*cur=='.') input=DOT;
else if(*cur=='e'||*cur=='E') input=EXPONENT;
state=transitionTable[state][input];
if(state==-1) return false;
}
return state == 1 || state == 4 || state == 7 || state == 8;
}
};