实现 atoi
,将字符串转为整数。
在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
思路要清晰,什么情况对应什么结果,献上渣图一张分两步:先求出第一个数字出现的位置,再从该位置的下一个位置开始,继续寻找数字累加至result
#include<climits>
class Solution {
public:
int myAtoi(string str) {
int nSize = str.size();
if(0 == nSize)
return 0;
int start = -1; // 第一个数字的起始位置
bool sign;
long result = 0;
long val = 0;
for(int i=0; i<nSize; i++)
{
if(str[i] == ' ') continue;
else if(str[i] == '+' || str[i] == '-')
{
if(str[i] == '+')
sign = true;
else
sign = false;
i++;
if(!(str[i] >= '0' && str[i] <= '9')) return 0;
result = 10*result + str[i] - '0';
start = i;
break;
}
else if(str[i] >= '0' && str[i] <= '9')
{
result = 10*result + str[i] - '0';
start = i;
sign = true;
break;
}
else
return 0;
if(start < 0)
return 0;
}
for(int i=start+1; i<nSize; i++)
{
if(str[i] >= '0' && str[i] <= '9')
{
result = 10*result + str[i] - '0';
val = (sign ? 1: -1) * result;
if(val > INT_MAX || val < INT_MIN)
return sign ? INT_MAX : INT_MIN;
}
else
break;
}
return sign ? result : -result;
}
};
超开心!!!LeetCode刷题以来第一次自己排查错误,AC了所有测试用例。
错误总结:
(1)输入“42”时,我的输出是 570,一脸懵逼,原来是
求result时马虎了直接加上str[i],but这是一个字符啊,必须转化成数字加进去:str[i] - ‘0’
(2)输入“+1”,我的输出“-1”,原来是第一个出现 + 或 - 号时,判断条件又马虎写错了,应该是
if( str[i] == ........),我写成了 if( i == ........)
完结~~