Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LeetCode 8. String to Integer (atoi) #31

Open
Woodyiiiiiii opened this issue Apr 26, 2020 · 0 comments
Open

LeetCode 8. String to Integer (atoi) #31

Woodyiiiiiii opened this issue Apr 26, 2020 · 0 comments

Comments

@Woodyiiiiiii
Copy link
Owner

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,就判断溢出。
当溢出时,要判断是要返回最大整数还是最小整数,因为两者数值不同。


参考资料:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant