这题目首先你要理解atoi函数的功能,然后去自己实现。
输入一个字符串,第一个非空字符是+、- 或者数字,否则直接输出0;符号后面必须必须是连续的数字(也就是数字前面最多紧接一个符号,否则输出0),遇到非数字就停止。
除了字符的格式还有就是注意整数的范围,INT_MAX,INT_MIN。我判断的地方不是很到位,所以后来直接在前面判断读入的数字的个数,如果超过10个,直接返回最大整数或最小整数。
“++123”输出0
“+ 123”输出0
“ 123”输出123
“+-123-1”输出0
“b123”输出0
class Solution {
public:
int myAtoi(string str) {
int len=str.length();
int i=0;
int ans=0;
int ad=0,su=0;
int ok=1;
int ok2=0;
while(i<len){
if(!ok) break;
if(str[i]=='+'){
ad++;
if(ad>1) return 0;
ok2=1;
}
else if(str[i]=='-'){
su++;
if(su>1) return 0;
ok2=1;
}
else if(str[i]>='0'&&str[i]<='9'){
if(ad>0&&ad==su) return 0;
ok=1;
int cnt=0;
int tmp[100];
while(i<len){
tmp[cnt++]=str[i++]-'0';
if(i>=len||!(str[i]<='9'&&str[i]>='0')) break;
}
// for(int j=0;j<cnt;j++) cout<<tmp[j]<<" ";cout<<endl;
if(cnt>10){
if(ad>=su) return INT_MAX;
else return INT_MIN;
}
for(int j=0;j<cnt;j++){
ans=ans*10+tmp[j];
if(ans<0&&ad>=su) return INT_MAX;
if(ans<0&&ad<su) return INT_MIN;
// if(ans>=INT_MAX){
// ans=ad<su?(ans*(-1)):INT_MAX;
// if(ad<su&&ans<INT_MIN) ans=INT_MIN;
// return ans;
// }
}
if(ad<su) ans*=-1;
break;
}
else if(str[i]!=' '&&!ok2) ok=0;
else if(ok2) ok=0;
i++;
}
return ans;
}
};