Leetcode 8 - String to Integer (atoi)

题目

https://leetcode.com/problems/string-to-integer-atoi/submissions/

题意

给出一个字符串,将该字符串转换成int。

若字符串以空格开头,且除空格外第一个字符是“+”、“-”、整数,则正常计算。否则输出0。

若计算过程中,发现是溢出的。则返回32位有符号整数的最大值或最小值。

Example 1:

Input: "42"
Output: 42

Example 2:

Input: "   -42"
Output: -42
Explanation: The first non-whitespace character is '-', which is the minus sign.
             Then take as many numerical digits as possible, which gets 42.

Example 3:

Input: "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.

Example 4:

Input: "words and 987"
Output: 0
Explanation: The first non-whitespace character is 'w', which is not a numerical 
             digit or a +/- sign. Therefore no valid conversion could be performed.

Example 5:

Input: "-91283472332"
Output: -2147483648
Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer.
             Thefore INT_MIN (−231) is returned.

思路

author's blog == http://www.cnblogs.com/toulanboy/

这道题考核的是整数的转换,不包含小数,所以实际上是超级简单的。

唯一需要注意的是题目的限制条件,测试数据中有很多非法字符串。

该题思路简单概况如下:

1、 先判断第一个非空格字符,是否正常。不正常就直接返回0.

2、 判断第一个是否出现了正负号,是的话,做相应正负数标记。

3、 循环组合成新的整数。在拼接新的数字前,先判断溢出情况。

值得注意的是:在我目前的写法中,一直都是以正数处理所有情况。所以正负数溢出判断都是以INT_MAX为基准,不过需要注意INT_MIN的绝对值比INT_MAX大1。

代码

class Solution {
public:
    int myAtoi(string str) {//author's blog == http://www.cnblogs.com/toulanboy/
        //先找到第一个非空格字符
        int i=0;
        while(str[i] == ' ')
            i++;
        //若第一个非空格字符不是整数、负号,则返回0
        if(str[i] != '-' &&  str[i] > '9' && str[i] < '0')
            return 0;
        //开始处理
        int result = 0;
        //判断负数
        bool negFlag = false;
        if(str[i] == '-'){
            negFlag = true;
            i++;
        }
        else if(str[i] == '+'){
            negFlag = false;
            i++;
        }
        while(str[i] >= '0' && str[i] <= '9'){
            //加入新的位数前,先判断是否溢出
            int newNum = str[i] - '0';
            if(negFlag == false && (result > INT_MAX / 10 || ( result == INT_MAX / 10 && newNum > 7)))
               return INT_MAX;
            if(negFlag == true  && (result > INT_MAX / 10 || ( result == INT_MAX / 10 && newNum >= 8)))
               return INT_MIN;
            result = result*10 + newNum;
            i++;
        }
        return negFlag?0-result:result;
        
    }
};

运行结果

Runtime: 8 ms, faster than 95.26% of C++ online submissions for String to Integer (atoi).
Memory Usage: 8.4 MB, less than 85.43% of C++ online submissions for String to Integer (atoi).
posted @ 2019-05-16 16:09  偷懒人  阅读(96)  评论(0编辑  收藏  举报