LeetCode:字符串轉換整數 (atoi)

LeetCode:字符串轉換整數 (atoi)

利用不一樣字符的 ASCII 編碼判斷種類,提取字符串中的數字,再判斷數字是否超出範圍函數

No.8 字符串轉換整數 (atoi)

題目:編碼

請你來實現一個 atoi 函數,使其能將字符串轉換成整數。spa

首先,該函數會根據須要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符爲止。code

當咱們尋找到的第一個非空字符爲正或者負號時,則將該符號與以後面儘量多的連續數字組合起來,做爲該整數的正負號;假如第一個非空字符是數字,則直接將其與以後連續的數字字符組合起來,造成整數。字符串

該字符串除了有效的整數部分以後也可能會存在多餘的字符,這些字符能夠被忽略,它們對於函數不該該形成影響。get

注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串爲空或字符串僅包含空白字符時,則你的函數不須要進行轉換。數學

在任何狀況下,若函數不能進行有效的轉換時,請返回 0it

假設咱們的環境只能存儲 32 位大小的有符號整數,那麼其數值範圍爲 [−231, 231 − 1]。若是數值超過這個範圍,請返回 INT_MAX (231 − 1) 或 INT_MIN (−231)io

示例 1:class

輸入: "42"
輸出: 42

示例 2:

輸入: "   -42"
輸出: -42
解釋: 第一個非空白字符爲 '-', 它是一個負號
咱們儘量將負號與後面全部連續出現的數字組合起來,最後獲得 -42

示例 3:

輸入: "4193 with words"
輸出: 4193
解釋: 轉換截止於數字 '3' ,由於它的下一個字符不爲數字

示例 4:

輸入: "words and 987"
輸出: 0
解釋: 第一個非空字符是 'w', 但它不是數字或正、負號
所以沒法執行有效的轉換

示例 5:

輸入: "-91283472332"
輸出: -2147483648
解釋: 數字 "-91283472332" 超過 32 位有符號整數範圍
所以返回 INT_MIN ($−2^{31}$)

解法:

  1. 數學方法

    遍歷每一個字符,判斷字符類型

    class Solution {
        public int myAtoi(String str) {
            int start = 0;
            while (str.length() > start && str.charAt(start) == ' ') start++;
            if (str.length() == start) return 0;
            int ans = 0;
            int flag = 1;
            char[] chars = str.toCharArray();
            for (int i = start; i < chars.length; i++) {
                if (i == start) {
                    if (getSymbol(chars[i]) == 0) return 0;
                    if (getSymbol(chars[i]) == 1) continue;
                    if (getSymbol(chars[i]) == -1) {
                        flag = -1;
                        continue;
                    }
                }
                if (getSymbol(chars[i]) == 2) {
                    if (flag == 1) {
                        if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && chars[i] - 48 > Integer.MAX_VALUE % 10))
                            return Integer.MAX_VALUE;
                        ans = ans * 10 + chars[i] - 48;
                    } else {
                        if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && -(chars[i] - 48) < Integer.MIN_VALUE % 10))
                            return Integer.MIN_VALUE;
                        ans = ans * 10 - (chars[i] - 48);
                    }
                } else break;
            }
            return ans;
        }
    
        public int getSymbol(char c) {
            if (c == '+') return 1;
            else if (c == '-') return -1;
            else if ((int) c >= (int) '0' && (int) c <= (int) '9') return 2;
            else return 0;
        }
    }
相關文章
相關標籤/搜索