Woodyiiiiiii / LeetCode

My private record of Leetcode solution

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LeetCode 8. String to Integer (atoi)

Woodyiiiiiii opened this issue · comments

Implement atoi which converts a string to an integer.

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

If no valid conversion could be performed, a zero value is returned.

Note:

  • Only the space character ' ' is considered as whitespace character.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. If the numerical value is out of the range of representable values, INT_MAX (231 − 1) or INT_MIN (−231) is returned.

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.

我写这道题的思路是循环遍历字符串,在循环中不断加入if判断语句。这样显得非常杂乱,有很多标志位,而且我也不会判断是否溢出。直接看大神的做法:

class Solution {
    public int myAtoi(String str) {
        int num = 0, i = 0, n = str.length();
        int sign = 1;
        if (str.isEmpty()) return 0;
        while (i < n && str.charAt(i) == ' ') ++i;
        if (i < n && (str.charAt(i) == '+' || str.charAt(i) == '-'))
            sign = (str.charAt(i++) == '+') ? 1 : -1;
        while (i < n && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
            if (num > Integer.MAX_VALUE / 10 
                || (num == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 7))
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            num = num * 10 + (str.charAt(i++) - '0');
        }
        
        return num * sign;
    }
}

注意点:

  1. 字符串开头是空格,要跳过,直到第一个字符出现;
  2. 第一个字符是'-'或者'+',要记录并保存;
  3. 数字溢出的情况

解决:使用while循环跳过空格,用sign标志位记录正负号,循环数字时,如果当前数字大于最大32位数的1/10,或者等于但当前字符大于7,就判断溢出。
当溢出时,要判断是要返回最大整数还是最小整数,因为两者数值不同。


参考资料: