错因:1.直接res=res*10+str[k],没有转换格式。
2.将条件写成while导致重复执行,没分清while和if的区别。
解题思路:
初始化变量 k 为 0,用来指向要找到的一段连续数字的起始位置。
使用 while 循环来找到第一个非空格字符,即跳过字符串开头的空格。
初始化变量 res 为 0,用来保存最终的整数结果,使用 long long 类型来预防溢出情况。
初始化变量 minus 为 1,用来表示数字的正负性。
如果遇到负号,则将 minus设为-1,并将指针k后移一位。如果遇到正号,则只将指针 k 后移一位。
使用 while 循环来遍历字符串中的数字字符,保证每个字符都在 ‘0’ 到 ‘9’ 的范围内。
将 res 乘以 10,然后加上当前数字字符与字符 ‘0’ 的差值,以将字符转换为实际的数字。
检查 res 是否超过了 10^11,如果超过则跳出循环。
将指针 k 后移一位,继续遍历下一个数字字符。
将 res 乘以 minus,以将其恢复为正确的正负值。
最后,根据结果 res 是否超过了 INT_MAX 或 INT_MIN。
返回最终的结果 res。
class Solution {
public:
int strToInt(string str) {
int k=0;//要找到一段从k开始的一段连续的数字
while(k<str.size()&&str[k]==' ')k++;//找到第一个非空格字符
long long res=0;//开long long防止有max出现的情况。
int minus=1;//可能会有负数。
if(k<str.size())
{
if(str[k]=='-')minus=-1,k++;//遇到负号
else if(str[k]=='+')k++;//遇到正号minus不改变。
}
while(k<str.size()&&str[k]>='0'&&str[k]<='9')//遍历数字,保证每个数字在0到9之间
{
res=res*10+str[k]-'0';//转成ASCII码
if(res>1e11)break;//1e11=1*10的11次方
k++;//继续遍历
}
res*=minus;
if(res>INT_MAX)res= INT_MAX;
if(res<INT_MIN)res=INT_MIN;
return res;
}
};