Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
Update (2015-02-10):
The signature of the C
function had been updated. If you still see your function signature accepts a const char *
argument, please click the reload button to reset your code definition.
挺简单又挺难的一道题,就是坑太多,已经不是丧心病狂能形容了,估计这也是算法竞赛和这种面试题之间的区别吧。
好吧,我承认我WA了10发,坑点请看代码注释。
代码语言:javascript复制class Solution {
public:
int myAtoi(string str) {
if(str.length()==0) // 1.空串
return 0;
int flag=0,first=0;
while(str[first]==' ')// 2.前置空格去除
first ;
if(str[first]=='-') //3.负号
{
flag=1;
first ;
}
else if(str[first]==' ')//4.还尼玛能出现正号,正负号只在开头出现一次的是合法的
first ;
if(str[first]<'0' || str[first]>'9') //5.除了正负号和数字还可能有其他字符,判为0
return 0;
long long ans=0;
int cnt=0;
for(int i=first;i<str.length();i )
{
cnt ;
if(cnt>17) //6.位数过大溢出longlong,更不用说int了
{
if(flag)
return INT_MIN;
else
return INT_MAX;
}
if(str[i]<'0' || str[i]>'9') //7.中途出现其他字符要中断,但前面的数字依旧视为合法的
break;
ans*=(long long)10;
ans =(long long)(str[i]-'0');
}
if(flag)
ans=-ans;
if(ans>INT_MAX)//8.int溢出处理
return INT_MAX;
if(ans<INT_MIN)
return INT_MIN;
return (int)ans;
}
};