Atoi
Apr 02, 2022// MAX:2147483647
// MIN:-2147483648
int myAtoi(string str) {
int state = 0;
int result = 0;
int n = 0;
char cur = str[n];
do
{
if (cur == ' ')
{
}
else if (cur >= '0' && cur <= '9')
{
state = 1;
break;
}
else if (cur == '-' || cur == '+')
{
state = cur == '+' ? 1 : -1;
cur = str[++n];
break;
}
else
{
break;
}
cur = str[++n];
} while (cur != '\0');
while (cur >= '0' && cur <= '9')
{
int curInt = cur - '0';
if (result > INT32_MAX / 10 || (result == INT32_MAX / 10 && curInt > 7))
{
return INT32_MAX;
}
else if (result < INT32_MIN / 10 || (result == INT32_MIN / 10 && curInt > 8))
{
return INT32_MIN;
}
result = result * 10 + curInt * state;
cur = str[++n];
}
return result;
}
速度较慢
改进后
int myAtoi(string str) {
int state = 0;
int result = 0;
int n = 0;
char cur = str[n];
while (cur != '\0')
{
if (cur == ' ' && state == 0)
{
cur = str[++n];
}
else if (cur >= '0' && cur <= '9')
{
if (state == 0)
{
state = 1;
}
else
{
int curInt = cur - '0';
if (state == 1)
{
if (result > (INT32_MAX - curInt) / 10)
{
return INT32_MAX;
}
else
{
result = result * 10 + curInt;
}
}
else
{
if (result < (INT32_MIN + curInt) / 10)
{
return INT32_MIN;
}
else
{
result = result * 10 - curInt;
}
}
cur = str[++n];
}
}
else if (cur == '-' && state == 0)
{
state = -1;
cur = str[++n];
}
else if (cur == '+' && state == 0)
{
state = 1;
cur = str[++n];
}
else
{
break;
}
}
return result;
}
优化了速度,其中包括
- 将两个 while 改成一个
- 极限判断的两个条件改成一个,减少多使用一次除法的概率
- 分开计算正负的累加,直接用 +-,取消统一乘以符号的操作
Comments