一、试题
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.
spoilers alert… click to show requirements for atoi.
二、代码
试了好多次
static int x=[](){
// toggle off cout & cin, instead, use printf & scanf
std::ios::sync_with_stdio(false);
// untie cin & cout
cin.tie(NULL);
return 0;
}();
class Solution {
public:
int myAtoi(string str) {
空字符直接返回
if(str.size()==0)
return 0;
该题中只会开头出现空格,除掉
int pos=0;
if( (pos = str.find_first_not_of(' '))!=0 )
str.erase(0,pos);
对第一个字符进行专门处理
long long res = 0;
bool flag=false;
if(str[0]=='-')
flag = true;
else if(str[0]>='1' && str[0]<='9'){
res = str[0]-'0';
}else if(str[0]!='+' && str[0]!='0')
return 0;
除去开头的0
if( (pos = str.find_first_not_of('0',1))!=1 && str[0]<'1' && str[0]>'9')
str.erase(0,pos);
else
str.erase(0,1);
正常遍历处理
for(int j=0; j<str.size(); j++){
if(str[j]>='0' && str[j]<='9'){
res = 10*res+str[j]-'0';
}else
break;
if(flag && -res<INT_MIN){
res = -INT_MIN;
break;
}
if(!flag && res>INT_MAX){
res = INT_MAX;
break;
}
}
return flag?-res:res;
}
};
别人代码写的就是优雅:
一开始除掉空格,然后在对正负号进行判断时如果判断为正负号则位置i++,这样可以保证为正负号时i会变成第一位数字,不为时还是第一位数字。另外开头的0其实对于计算过程没有影响。第三就是在判断INTMAX和INTMIN巧妙利用INTMIN绝对值大于INTMAX仅是1,判断大于INTMAX后可以直接通过正负号判定输出。
static int x=[](){
// toggle off cout & cin, instead, use printf & scanf
std::ios::sync_with_stdio(false);
// untie cin & cout
cin.tie(NULL);
return 0;
}();
class Solution {
public:
int myAtoi(string str) {
int i = str.find_first_not_of(' '), s = 1;
long res = 0;
if(str[i]=='+'||str[i]=='-')
s = (str[i++]=='+')?1:-1;
while(isdigit(str[i])) {
res = res*10 + (str[i++]-'0');
if(res>INT_MAX) return s>0?INT_MAX:INT_MIN;
}
return s*res;
}
};