class Solution {
public:
int myAtoi(string str) {
int length,i=0,p;
int start,end; //指向数字部分的开头和结尾下标
length==str.length(); //字符串的长度
while(str[i]==' ') //跳过去前面的空格字符
i++;
if(str[i]>='0'&&str[i]<='9'){ //如果空格字符后面直接是数字部分
while(str[i]=='0') //刚开始的0不用算进去有效数字部分的,跳过去
i++;
p=0; //判断是正数还是负数,0代表正数,1代表负数
start=i; //有效数字开始的下标
while(str[i]>='0'&&str[i]<='9'){
i++;
}
end=i-1; //有效数字结束的下标
}else if(str[i]=='+'||str[i]=='-'){ //如果空格字符后面是'+'或者'-'
if(str[i]=='+')
p=0; //正数
else
p=1; //负数
++i;
while(str[i]=='0') //去掉'+'、'-'号后面刚开始的无效的0数字
i++;
start=i; //有效数字的开始下标
while(str[i]>='0'&&str[i]<='9'){
i++;
}
end=i-1; //有效数字的结束下标
}else //如果空格字符后面不是上述的情况,返回0
return 0;
if(end-start+1>10) //有效数字部分的长度,大于10意味无法用int存储
{
if(p==0) //正数
return INT_MAX;
else //负数
return INT_MIN;
}
else{
long ans=0; //用长整数ans存储有效数字构成int的值
for(i=start;i<=end;i++)
ans=ans*10+str[i]-'0';
if(p==0&&ans<=INT_MAX) //正数且小于INT_MAX,肯定返回自身了
return ans;
else if(p==0&&ans>INT_MAX) //整数但是超范围了,返回INT_MAX
return INT_MAX;
else if(p==1&&ans<=2147483648) //负数但是没有超范围,返回自身
return -1*ans;
else if(p==1&&ans>2147483648) //负数超范围,返回INT_MIN
return INT_MIN;
}
}
};
另外,大家如果想要加快自己代码的运行时间,可以尝试在类外面加下面代码:
static auto _=[]()
{
ios::sync_with_stdio(false);
cin.tie(0);
return 0;
}();
其实我感觉上面的代码思路还是比较顺的,大家有什么问题可以提出来,哈哈!
初学者,代码如有错误,欢迎大家指出!