解题思路
首先我的做法是字符串模拟,时间上呢,确实用的稍微多了一点,但是绝不至于超时。
接下来简单的给分析一下:
1、首先处理字符串中前导空格的情况;
2、判断处理完前导空格后遇到的第一个非空格字符,若既不是‘+’,也不是‘-’,还不是数字字符的话,就直接返回0即可
3、 若遇到的第一个字符是数字字符,则需要用string类型的b来记录一下以该字符开始的连续的数字字符,接着处理b的前导0字符,然后需要一个范围的判断,就是判断一下处理完前导0字符的b的长度是否超过int的范围(我这里取得是11位),如果超过了的话,直接返回INT_MAX,若未超过,则用trans函数来进行转换,(函数作用就是将一个全是数字字符的字符串转换为一个整数),最后判断该整数是否在int类型的范围内,然后返回相应的值即可;
4、对于第一个字符(处理过前导空格字符后),若是’+’或者‘-’,判断一下下一个字符是什么,若不是数字字符,就直接返回0,若是数字字符,则和第三步的处理情况类似。
好了,上代码:
class Solution {
public:
typedef long long ll;
ll qpow(int x,int y)
{
ll res=1;
for(int i=0;i<y;i++)
{
res*=(ll)x;
}
return res;
}
ll trans(string a)
{
ll ans=0;
for(int i=0,j=a.size()-1;i<a.size();i++,j--)
{
ans+=(ll)(a[i]-'0')*qpow(10,j);
}
return ans;
}
int myAtoi(string str) {
int i=0;
while(str[i]==' ') i++;
if(i>=str.size()) return 0;
if(str[i]!='+'&&str[i]!='-'&&!(str[i]>='0'&&str[i]<='9')) return 0;
if(str[i]=='-')
{
string a,b;
if(!(str[i+1]>='0'&&str[i+1]<='9')) return 0;
for(int j=i+1;j<str.size();j++)
{
if(str[j]>='0'&&str[j]<='9')
b+=str[j];
else break;
}
int i=0;
while(b[i]=='0') i++;
for(;i<b.size();i++) a+=b[i];
if(a.size()>=11) return INT_MIN;
ll ans=trans(a);
if(-ans<INT_MIN) return INT_MIN;
else return -ans;
}
else{
int k=0;
if(str[i]=='+')
k=i+1;
else if(str[i]>='0'&&str[i]<='9') k=i;
string b,a;
for(int j=k;j<str.size();j++)
{
if(str[j]>='0'&&str[j]<='9')
b+=str[j];
else break;
}
int i=0;
while(b[i]=='0') i++;
for(;i<b.size();i++) a+=b[i];
if(a.size()>=11) return INT_MAX;
//cout<<a<<endl;
ll ans=trans(a);
if(ans>INT_MAX) return INT_MAX;
else return ans;
}
}
};