题意理解
给定一个字符串,按照规则转换成整数,如果大于INT_MAX,设置为INT_MAX;如果小于INT_MIN,设置为INT_MIN;如果不是整数,设置成0
问题分析
自动状态机+整数边界判断。
其他
链接
class Solution {
public:
int strToInt(string str) {
enum STATUS_TYPE {
START,
ONE,
TWO,
THREE
};
enum INPUT_TYPE {
BACKSPACE,
SIGN,
NUM,
OTHER
};
unordered_map<STATUS_TYPE, unordered_map<INPUT_TYPE, STATUS_TYPE>> my_dict = {
{
START, {
{BACKSPACE, ONE},
{SIGN, TWO},
{NUM, THREE}
}
},
{
ONE, {
{BACKSPACE, ONE},
{SIGN, TWO},
{NUM, THREE}
}
},
{
TWO, {
{NUM, THREE}
}
},
{
THREE, {
{NUM, THREE}
}
}
};
STATUS_TYPE st = START;
INPUT_TYPE input;
bool flag = 0;
int start = 0;
int end = 0;
long VAL = 1;
bool first = true;
for(int i = 0; i < str.size(); i++) {
//cout << "flag " << flag << endl;
char ch = str[i];
if (ch == ' ') {
input = BACKSPACE;
}
else if (ch == '+'){
input = SIGN;
}
else if (ch == '-') {
input = SIGN;
flag = flag ? 0 : 1;
}
else if (ch >= '0' && ch <= '9') {
input = NUM;
if (first) {
VAL = ch - '0';
first = false;
}
else {
VAL = 10 * VAL + ch - '0';
cout << VAL << endl;
if (flag == 0) {
if (VAL > INT_MAX) {
VAL = INT_MAX;
break;
}
}
else {
long tmpVAL = -1 * VAL;
if (tmpVAL < INT_MIN) {
VAL = INT_MIN;
break;
}
}
}
}
else {
input = OTHER;
}
cout << "input " << input << endl;
if(my_dict[st].count(input)) {
st = my_dict[st][input];
}
else {
if (ch == '-') flag = flag ? 0 : 1; //修正bug
break;
}
cout << st << endl;
}
if (st == START || st == ONE || st == TWO) {
return 0;
}
//cout << VAL << endl;
if (flag) return -1 * VAL;
else return VAL;
}
};