[LintCode]轉換字符串到整數


問題描述:

實現atoi這個函數,將一個字符串轉換為整數。如果沒有合法的整數,返回0。如果整數超出了32位整數的范圍,返回INT_MAX(2147483647)如果是正整數,或者INT_MIN(-2147483648)如果是負整數。

樣例

"10" =>10

"-1" => -1

"123123123123123" => 2147483647

"1.0" => 1

問題分析:

這道題特別惡心,雖然思路很簡單,但是它卻表述不清。經過若干次失敗的嘗試,終於明白了它的含義。大概有以下幾種注意情況:

(一).""的話返回0。

(二).字符串兩邊有空格自動屏蔽,有小數點小數點后面的內容舍棄。

(三)."+123"和"123"效果一樣。

(四)."a...","-h..."這種,除了符號位只要非數字打頭,返回0。

(五)."123gdah3423","-123ff777"這種返回123,-123。

(六).超了范圍之后,判斷正負性。

問題求解:

public class Solution {
    /**
     * @param str: A string
     * @return An integer
     */
       public int atoi(String str) {
        // 去除小數位和兩邊的空格,存在str1中
        String str1 = null;
        // 后面數字和非數字混合的情況,用於截取前面的數字
        StringBuilder sb = new StringBuilder();
        if (str.contains(".")) {
            str1 = str.substring(0, str.indexOf(".")).trim();
        } else {
            str1 = str.trim();
        }
        try {
            if ("".equals(str1)) {
                return 0;
            }
            return Integer.parseInt(str1);
        } catch (NumberFormatException e) {
            /*
             * 先進行判斷,字符串前面是否有"+"和"-",分三種情況
             */
            //1.前面既沒有"+"也沒有"-"
            if (str1.charAt(0) != '-' && str1.charAt(0) != '+') {
                processData(0, str1, sb);
                if (sb.length() == 0) {// 第一個是非數字
                    return 0;
                } else if (sb.length() < str1.length()) {// 數字中夾雜非數字
                    return atoi(sb.toString());
                } else {// 全是數字
                    return Integer.MAX_VALUE;
                }
            //2.前面是"+"
            } else if (str1.charAt(0) == '+') {
                processData(1, str1, sb);
                if (sb.length() == 0) {// 第一個是非數字
                    return 0;
                } else if (sb.length() < str1.length() - 1) {// 數字中夾雜非數字
                    return atoi(sb.toString());
                } else {// 全是數字
                    return Integer.MAX_VALUE;
                }
            //3.前面是"-"
            } else {
                sb.append('-');
                processData(1, str1, sb);
                if (sb.length() == 1) {// 第一個是非數字
                    return 0;
                } else if (sb.length() < str1.length()) {// 數字中夾雜非數字
                    return atoi(sb.toString());
                } else {// 全是數字
                    return Integer.MIN_VALUE;
                }
            }
        }
    }

    public void processData(int start, String str1, StringBuilder sb) {
        for (int i = start; i < str1.length(); i++) {
            if (str1.charAt(i) < '0' || str1.charAt(i) > '9') {
                break;
            }
            sb.append(str1.charAt(i));
        }
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM