力扣对应题目链接:8. 字符串转换整数 (atoi) - 力扣(LeetCode)
一、《剑指Offer》对应内容
二、分析题目
根据题意,有以下四种字符需要考虑:
- 首部空格: 删除之即可。
- 符号位: 三种情况,即 ''+''、''−''、''无符号"。新建一个变量保存符号位,返回前判断正负即可。
- 非数字字符: 遇到首个非数字的字符时,应立即返回。
- 数字字符:
- 字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可。
- 数字拼接: 若从左向右遍历数字,设当前位字符为 ch,当前位数字为 x,数字结果为 res,则数字拼接公式为:
res = 10×res + x
x = ascii(ch)−ascii(′0′)
数字越界处理:
题目要求返回的数值范围应在 [−2^31, 2^(31−1)] ,因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 res 在 int 类型的取值范围内。
在每轮数字拼接前,判断 res 在此轮拼接后是否超过 INT_MAX(2147483647),若超过则加上符号位直接返回。
- res > INT_MAX / 10 情况一:执行拼接 10×res ≥ 2147483650 越界
- res = INT_MAX / 10, x>7 情况二:拼接后是 2147483648 或 2147483649 越界
三、代码
class Solution {
public:
int myAtoi(string s) {
int n=s.size();
if(n==0) return 0;
int res=0;
int sign=1;
int i=0;
while(s[i]==' ')
{
i++;
if(i==n) return 0;
}
if(s[i]=='-')
{
sign=-1;
i++;
}
else if(s[i]=='+') i++;
for(int j=i; j<n; j++)
{
if(s[j]<'0' || s[j]>'9') break;
if(res>INT_MAX/10 || (res==INT_MAX/10 && s[j]>'7'))
{
if(sign==1) return INT_MAX;
else return INT_MIN;
}
res=res*10+(s[j]-'0');
}
return sign*res;
}
};