LeetCode 8. String to Integer (atoi)


原题描述

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

Input: "     -1a12ac12       "  
Output: -1

算法:注意特殊情况的处理

算法步骤如下:
1. 判断空字符串
2. 删除首尾空格
3. 判断删除之后是不是一个空字符串
4. 现将符号位$sign = 1$,再判断第一个位置是否是$+,-$,并将符号位置1或者0,i往后移动一位。
5. 开始转换int,使用long long类型的$ret$来循环转换,防止溢出,若碰到非法字符或者数值溢出,直接退出循环
6. 将转换的数乘上符号位$ret = ret * sign$,再判断上下界的溢出情况。
7. 返回$ret$

C++代码如下:

class Solution {
public:
    // 字符串转int,注意判断超出Int范围
    int myAtoi(string str) {
        if (str == "") return 0;
        // 去首尾空格
        str.erase(0, str.find_first_not_of(' '));
        str.erase(str.find_last_not_of(' ') + 1);
        
        int i = 0, len = str.length(), sign = 1;
        //while ( i < len && str[i] == ' ') i++;
        if (i == len) return 0;
        if (str[i] == '+') {
            sign = 1;
            i++;
        } else if (str[i] == '-') {
            sign = -1;
            i++;
        }
        // 转换结果可能超出int范围,使用long long作为转换后接收变量的类型
        long long ret = 0;
        for (; i < len; i++) {
            if (str[i] < '0' || str[i] > '9') break;
            ret = ret * 10 + (str[i] - '0');
            if (ret > INT_MAX) break;
        }
        ret *= sign;
        if (ret > INT_MAX) return INT_MAX;
        if (ret < INT_MIN) return INT_MIN;
        return ret;
    }
};

Bug Free Procedure 从记事本直接写代码

2016.12.01 语法错误
1. C++库里面字符串的函数str.erase(), find_first_not_of

2016.12.06 语法错误+逻辑错误
1. C++库里面字符串的函数str.erase(), find_first_not_of
2. for循环的时候i忘记自加

2016.12.13 逻辑错误
1. str.find_last_not_of(‘ ‘)之后需要+1



本作品由 Marvin.Cao 创作,采用 CC BY-NC-SA 3.0 许可协议 进行许可。

Comments