天天看點

LeetCode 第8題:實作 atoi,将字元串轉為整數

題目描述:

實作 atoi,将字元串轉為整數。

該函數首先根據需要丢棄任意多的空格字元,直到找到第一個非空格字元為止。如果第一個非空字元是正号或負号,選取該符号,并将其與後面盡可能多的連續的數字組合起來,這部分字元即為整數的值。如果第一個非空字元是數字,則直接将其與之後連續的數字字元組合起來,形成整數。

字元串可以在形成整數的字元後面包括多餘的字元,這些字元可以被忽略,它們對于函數沒有影響。

當字元串中的第一個非空字元序列不是個有效的整數;或字元串為空;或字元串僅包含空白字元時,則不進行轉換。

若函數不能執行有效的轉換,傳回 0。

說明:

假設我們的環境隻能存儲 32 位有符号整數,其數值範圍是

LeetCode 第8題:實作 atoi,将字元串轉為整數
。如果數值超過可表示的範圍,則傳回
LeetCode 第8題:實作 atoi,将字元串轉為整數

解決思路:

  • 如果按照規則來做,一定要簡潔,不然非常麻煩。
public int myAtoi(String str){
        if(str == null || "".equals(str))
            return 0;
        int sign = 1, base = 0, i = 0, n = str.length();
        while(i < n && str.charAt(i) == ' ')
            i++;
        if(str.charAt(i) == '+' || str.charAt(i) == '-'){
            sign = (str.charAt(i++) == '+') ? 1 : -1;
        }
        while(i < n && str.charAt(i) >= '0' && str.charAt(i) <= '9'){
            //&& str.charAt(i) - '0' > 7表示最後一位産生了溢出
            if(base > Integer.MAX_VALUE / 10 || (base == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 7)){
                return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            base = 10 * base + (str.charAt(i++) - '0');
        }
        return base * sign;
    }