1. 程式人生 > >LEETCODE 8 String to Integer (atoi) (JAVA題解)

LEETCODE 8 String to Integer (atoi) (JAVA題解)

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

原題如上。

題意解析:

要把一個字串轉換成一個整數。

字串的輸入可能有如下幾種情況:

1.字串的前面可能會有很多空格,這些空格要忽略不計,例如 “      Hello” 要把它當成 “Hello” 來處理

2.如果字串為“+1234abc”,那麼當成“+1234”來處理,如果是“+1234abc1234”,也當成“+1234”來處理,“+1234abc”與“1234abc”同義

3.字串也有可能是“-1234Aabc”,所以要考慮符號

4.如果結果超出一個int的範圍,大於最大值,輸出int最大值2147483647,小於最小值,輸出-2147483648

5.如果字串為空串,或者像“abc12345”,“+abc345d”這樣,即出符號位以外,不是由數字開頭的,那麼就認為無法轉換,對於無法轉換的輸入,輸出0

注意點:

由於計算結果有可能大於int範圍,所以運算過程中結果用long型變數儲存

解題程式碼如下

public int myAtoi(String str) {
        
        //結果數字
        long result=0;
        
        //去掉開頭的空白字元
        str=str.trim();
        
        //空字元傳,邊界條件
        if(str.equals("")) return 0;
        
        //提取符號
        int sgn;
        if(str.charAt(0)=='+' || isDigit(str.charAt(0))){
            sgn=1;
            if(isDigit(str.charAt(0))){
                str="+"+str;
            }
        } 
        else if(str.charAt(0)=='-') sgn=-1;
        else return 0;
        
        //符號位後一個不是數字,也是邊界條件
        if(str.length()<=1 || !(isDigit(str.charAt(1)))) return 0;
        
        //轉換邏輯由此開始
        for(int i=1;i<str.length() && isDigit(str.charAt(i));i++){
            result=result*10+str.charAt(i)-'0';
            if(sgn*result>=Integer.MAX_VALUE) return Integer.MAX_VALUE;
            if(sgn*result<=Integer.MIN_VALUE) return Integer.MIN_VALUE;
        }
        return (int)(sgn*result);
    }
    
    private boolean isDigit(char c){
        return c>='0' && c<='9';
    }