8. String to Integer (atoi)字符串转换
2017-08-09 本文已影响58人
安东可
实现atoi将字符串转换为整数。
提示:仔细考虑所有可能的输入案例。如果你想挑战,请不要在下面看到,问问自己可能输入的情况是什么。
注意:它是为这个问题指定模糊的(即,没有给定的输入规格)。你有责任把所有的输入需求收集到前面。
【别人的总结】
照着要求写代码,可以总结如下:
- 字串为空或者全是空格,返回0;
- 字串的前缀空格需要忽略掉;
- 忽略掉前缀空格后,遇到的第一个字符,如果是‘+’或‘-’号,继续往后读;如果是数字,则开始处理数字;如果不是前面的2种,返回0;
- 处理数字的过程中,如果之后的字符非数字,就停止转换,返回当前值;
- 在上述处理过程中,如果转换出的值超出了int型的范围,就返回int的最大值或最小值。
class Solution {
public:
int myAtoi(string str) {
long long result = 0;
int flag = 1;//负号标志
size_t i = 0,len = str.size();
//跳过空白
while (str[i] == ' '){ ++i; }
//查看 + -
if (str[i] == '-' || str[i] == '+'){
flag = (str[i++] == '+') ? 1 : -1;
}
while (str[i] <= '9' && str[i] >= '0')
{
//每个字符都是以ascii码读取,所有需要减去0的ascii值:48
result = result * 10 +(str[i++]-'0');
if (result >= INT_MAX&&flag ==1){
return INT_MAX;
}
else if (-result <= INT_MIN&&flag == -1)
{
return INT_MIN;
}
}
return result*flag;
}
};
【别人家的代码】
class Solution {
public:
int myAtoi(string str) {
long long res = 0; // string could be greater than max long long ;
int i = 0;
bool sign = true;
// 1) step trim out whitespace;
while (str[i] == ' ' && i < str.length()) {
i++;
}
// 2) deal with sign;
if (str[i] == '+' || str[i] == '-') {
sign = (str[i] == '+') ? true : false;
i++;
}
// 3) compute value;
while (i < str.length()) {
//compute current value;
if (str[i] >= '0' && str[i] <= '9') {
res = res*10 + str[i]- '0';
if (res - INT_MAX >= 1) { //overflow;
break;
}
i++;
} else {
break;
}
}
if (res - INT_MAX >= 1) {
if (sign) {
return INT_MAX;
}
return INT_MIN;
}
res = sign ? res : (-1)*res;
return res;
}
};