leetcode 8. String to Integer (atoi)
标签(空格分隔): leetcode
1. 原题意思:
实现atoi() 实现将字符串转化为int型整数,至于多少种情况自己考虑。。
2.分析:
- 空的字符串: “” ,判定为0
- 普通的正负数: “-123”, “123”, “+123”
- 开头带有空格的字符串: ” -123”, ” 123”, 去空格处理
- 带有2个或以上的符号的字符串: “-+123”, ” +-123”, 判定为输出0
- 带有非数字的字符串: ” -12a3”, 只需要输出在非数字前的值
- 溢出问题:溢出分别取取最大最小值
3. 值得注意的溢出问题:
每次读取有意义的一位数字digit, 转化为数字后, 使用
result = result * 10 + digit
可以迭代到结果, 所以每次在result进行迭代的之前要判断结果会不会溢出。。
先用 result 与 INT_MAX /10 进行比较: 若 result > INT_MAX/10, 说明最终得到的整数一定会溢出, 故此时可以当即进行溢出处理。
当 result=INT_MAX/10 时,若 digit > INT_MAX%10,说明 result*10+digit 最终还是会溢出, INT_MIN一样。
但是值得注意的是, max_div = -INT_MIN / 10 的表示不对, 按照平时的数值来看, -INT_MIN应该是正数, max_div也该是正数。。但是结果是负数, 需要使用max_div = -(INT_MIN/10)
4. 代码
class Solution {
public:
int myAtoi(string str) {
int max_div = INT_MAX / 10;
int min_div = -(INT_MIN / 10);
int max_m = INT_MAX % 10;
int min_m = -(INT_MIN % 10);
int result = 0;
int countSign = 0;
int i = 0, len = str.length();
int sign = 1;
int digit = str[0];
while (str[i] == ' ' || str[i] == '0') {
i++;
}
while (str[i] == '-' || str[i] == '+') {
if (str[i] == '-')
sign *= -1;
countSign++;
if (countSign > 1)
return 0;
i++;
}
while (i < len) {
digit = str[i++] - '0';
if (digit >= 0 && digit <= 9) {
if (sign == 1 && (result > max_div || (result == max_div && digit > max_m)))
return INT_MAX;
if (sign == -1 && (result > min_div || (result == min_div && digit > min_m)))
return INT_MIN;
}
else {
break;
}
result = result * 10 + digit;
}
return (sign == 1) ? result : -result;
}
};