一、题目描述
二、题目分析
- 这是剑指Offer上的原题的弱化版本
- 首先光标移动到第一个不为
' '
的地方,检查是不是数字或者正负号,如果不是直接返回0 - 检查光标处是否为数字,不是就返回0;否则就找到字符串里在光标后第一个不为数字的位置,或者找到字符串结尾而终止
- 把这两个位置中间的字符转化为数字,在设置
sum
变量时,设置类型为long
以免溢出
三、题目辨析
再来说这道题为什么是弱化过的剑指Offer上的原题
- 考虑下面两种情况
- 字符串无效,返回0
- 字符串正确,正确结果本身就是0
那我们怎么区分到底发生了哪一种情况呢?显然我们无法区分
这就需要我们设置一个全局标志量,用以区分当返回值是0时,到底是正确返回0还是字符串错误返回0,但是这道题并没有要求
四、解题代码
class Solution {
public:
int myAtoi(string str) {
bool IsPos = 1;
if(!str.size()) return 0;
int pos = 0;
while(str[pos] == ' '){
pos++;
}
if((str[pos] == str.size()) || !((str[pos] >= '0' && str[pos] <= '9') || (str[pos] == '+' || str[pos] == '-'))){
return 0;
}
if(str[pos] == '-' || str[pos] == '+'){
IsPos = (str[pos] == '-' ? 0 : 1);
pos++;
if(str[pos] < '0' || str[pos] > '9')
return 0;
}
int end = pos;
while(str[end] >= '0' && str[end] <= '9' && end < str.size()){
end++;
}
long sln = 0;
for(int i = pos; i < end; i++){
if(IsPos){
if(sln * 10 + (str[i] - '0') <= INT_MAX)
sln = sln * 10 + (str[i] - '0');
else
return INT_MAX;
}
else{
if(sln * 10 - (str[i] - '0') >= INT_MIN)
sln = sln * 10 - (str[i] - '0');
else
return INT_MIN;
}
}
return sln;
}
};