LeetCode 腾讯精选练习50 题——8. 字符串转换整数 (atoi)
题目
解答
解答前看清楚题目给出的示例,有助于了解可能会出现的所有情况。
按照题目的意思,可以成功转换为整数的例子应该是:
1. 在整数(该整数可能会带‘+’或‘-’)前的字符必须都为空格
2. 在整数部分中一旦出现不是数字的字符,该字符后面的字符都直接舍弃,不会进行转换
第一次的时候因为不清楚,写的代码比较混乱,如下:
class Solution {
public:
int myAtoi(string str) {
if(str.length() < 1)
return 0;
int ans = 0;
int positive = 1;
bool num_meet = false, n_p = false;
for(int i = 0; i < str.length(); i++) {
if(!num_meet && n_p && (str[i]<'0' || str[i]>'9'))
return 0;
if(!num_meet && str[i] == ' ')
continue;
if(str[i] == '-' && positive == 1 && !num_meet && !n_p) {
n_p = true;
positive = -1;
continue;
}
if(str[i] == '+' && positive == 1 && !num_meet && !n_p) {
n_p = true;
positive = 1;
continue;
}
if(!num_meet && (str[i]<'0' || str[i]>'9'))
return 0;
if(num_meet && (str[i]<'0' || str[i]>'9'))
return ans;
num_meet = true;
if(positive == 1 && (ans > INT_MAX/10 || (ans==INT_MAX/10 && str[i]-'0' > 7)))
return INT_MAX;
if(positive == -1 && (ans < INT_MIN/10 || (ans==INT_MIN/10 && str[i]-'0' > 8)))
return INT_MIN;
ans = -positive * (-abs(ans)*10 - (str[i]-'0'));
}
return ans;
}
};
第二次的时候,参考了博客https://blog.****.net/weixin_38976558/article/details/85602031,感觉代码思路清晰了很多,如下:
class Solution {
public:
int myAtoi(string str) {
if(str.length()==0)
return 0;
int negative=1;
int ans=0;
int i=0;
while(str[i]==' ')
i++;
if(str[i]=='-')
{
negative = -1;
i++;
}
else if(str[i]=='+')
{
negative = 1;
i++;
}
if(str[i]<'0'||str[i]>'9')
return 0;
while(str[i]!='\0'&&str[i]>='0'&&str[i]<='9')
{
if(negative == 1 && (ans > INT_MAX/10 || (ans==INT_MAX/10 && str[i]-'0' > 7)))
return INT_MAX;
if(negative == -1 && (ans < INT_MIN/10 || (ans==INT_MIN/10 && str[i]-'0' > 8)))
return INT_MIN;
ans = -negative * (-abs(ans)*10 - (str[i]-'0'));
i++;
}
return ans;
}
};