题意理解
给定一个字符串,指定数值的格式规范,判断字符串是不是一个数值。
问题分析
用自动状态机,最难的是设计状态和状态变迁的过程,如下图。状态机的优点是清晰,方便修改。
其他
状态机是解复杂校验的最佳方法,化烦为简,主观能动性的深刻体现。
链接
class Solution {
public:
bool isNumber(string s) {
enum STATUS_TYPE {
START,
ONE,
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE,
TEN,
EXCEPTION
} ;
enum INPUT_TYPE {
BACKSPACE,
SIGN,
NUM,
DOT,
Ee,
OTHER
} ;
STATUS_TYPE st = START;
unordered_map<STATUS_TYPE, unordered_map<INPUT_TYPE, STATUS_TYPE>> my_dict{
{
START, {
{BACKSPACE, ONE},
{SIGN, TWO},
{NUM, THREE},
{DOT, FOUR}
}
},
{
ONE, {
{BACKSPACE, ONE},
{SIGN, TWO},
{NUM, THREE},
{DOT, FOUR}
}
},
{
TWO, {
{NUM, THREE},
{DOT, FOUR}
}
},
{
THREE, {
{BACKSPACE, TEN},
{DOT, FIVE},
{NUM, THREE},
{Ee, SEVEN}
}
},
{
FOUR, {
{NUM, SIX}
}
},
{
FIVE, {
{BACKSPACE, TEN},
{Ee, SEVEN},
{NUM, SIX}
}
},
{
SIX, {
{NUM, SIX},
{Ee, SEVEN},
{BACKSPACE, TEN}
}
},
{
SEVEN, {
{SIGN, EIGHT},
{NUM, NINE}
}
},
{
EIGHT, {
{NUM, NINE}
}
},
{
NINE, {
{NUM, NINE},
{BACKSPACE, TEN}
}
},
{
TEN, {
{BACKSPACE, TEN}
}
}
};
for (char ch : s) {
INPUT_TYPE input;
if (ch == ' ') {
input = BACKSPACE;
}
else if (ch >= '0' && ch <= '9') {
input = NUM;
}
else if (ch == '+' || ch == '-') {
input = SIGN;
}
else if (ch == '.') {
input = DOT;
}
else if (ch == 'E' || ch == 'e') {
input = Ee;
}
else {
input = OTHER;
}
if (my_dict[st].count(input)) {
st = my_dict[st][input];
}
else {
st = EXCEPTION;
break;
}
cout << st << endl;
}
//cout << st << endl;
if (st == THREE || st == FIVE || st == SIX || st == NINE || st == TEN) {
return true;
}
return false;
}
};