题意
解题思路
根据题意,有以下四种字符需要考虑:
- 首部空格: 删除之即可;
- 符号位: 三种情况,即 ''+'' , ''−'' , ''无符号" ;新建一个变量保存符号位,返回前判断正负即可
- 非数字字符: 遇到首个非数字的字符时,应立即返回。
- 数字字符:
- 字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
- 数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为:res = 10*res+(c-'0)
数字越界问题:
题目要求返回的数值范围应在[
] 。因此需要考虑数字越界问题。而由于题目指出,环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终持 res 在 int 类型的取值范围内。
-1 = 2147 4836 47
在每轮数字拼接前,判断 res 在此轮拼接后是否超过 2147 4836 47 ,若超过则加上符号位直接返回。在拼接之前必须判断这一步,否则会报错。
设数字拼接边界 boundary= 2147 4836 47 / 10 = 2147 4836 4 ,则以下两种情况越界:
- res>boundary:执行拼接后, 10*res ≥ 2147 4836 50 。这已经超出了INT_MAX
- res=boundary,x>7 :执行拼接后,res=2147 4836 48 或 res = 2147 4836 49。也已经超出了INT_MAX
C++题解
class Solution
{
public:
int strToInt(string str)
{
int res=0,boundary=INT_MAX/10;
int i=0,sign=1,len=str.size();
while(str[i]== ' ')
{
if(++i==len) //全都是空格的情况
return 0;
}
if(str[i]=='-')
sign=-1;
if(str[i]=='-'||str[i]=='+')
i++;
for(int j=i;j<len;++j)
{
if(str[j]<'0'||str[j]>'9')
break;
int x = str[j]-'0';
if(res>boundary)
{
return sign==-1?INT_MIN:INT_MAX;
}
else if(res==boundary&&x>7)
{
return sign==-1?INT_MIN:INT_MAX;
}
else
{
res = res*10+x;
}
}
return sign*res;
}
};