LeetCode:String to Integer (atoi) - 字符串到數字的轉換

一、題目名稱java

String to Integer (atoi) (字符串到數字的轉換)正則表達式

二、題目地址函數

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

三、題目內容code

英文:Implement atoi to convert a string to an integer.orm

中文:實現atoi函數,將輸入的字符串(String類型)轉換爲整型數據(Integer類型)leetcode

提示:實現的atoi函數須要知足如下特徵開發

  • 忽略字符串第一個非空格字符前的全部空格(whitespace),第一個非空格字符能夠是正負號,後面接純數字,atoi函數將這些純數字轉換爲整型並返回字符串

  • 在數字字符後面能夠接其餘任何字符,但這些非數字的字符將被忽略get

  • 若是字符串中第一個非空格字符不是一個數字,字符串爲空或僅由空格組成,則不對之進行轉換

  • 若是沒法對字符串進行轉換,返回0。若是取值過大或太小,返回整型數字的最大值INT_MAX(2147483647)或最小值INT_MIN(-2147483648)

四、解題方法1

可使用Java中的Integer.parseInt函數解決問題,但Integer.parseInt函數與題目中描述的atoi在接收的輸入上條件更爲苛刻,所以須要將輸入的字符串先轉換爲Integer.parseInt能夠轉換的形式(即將純數字和前面的正負號先提取出來,再調用Integer.parseInt)。另外,在數值轉換過程當中,須要對彈出的異常信息進行判斷,若是是由於溢出致使的NumberFormatException,則返回整型數字的最大或最小值,不然按沒法轉換處理,直接返回0。

Java代碼以下:

/**
 * 功能說明:LeetCode 8 - String to Integer (atoi)
 * 開發人員:Tsybius2014
 * 開發時間:2015年7月31日
 */
public class Solution {
    
    /**
     * Atoi函數
     * @param str
     * @return
     */
    public int myAtoi(String str) {
        
        //輸入爲空直接返回0
        if (str.isEmpty()) {
            return 0;
        }
        
        str = str.trim();
        
        char[] array = str.toCharArray();
        
        //判斷數字的正負
        boolean sign = true;
        if (array[0] == '-') {
            sign = false;
        }
        
        //字母第一次出現時,忽略後面的字符
        int index = -1;
        int signcount = 0;
        for(int i = 0; i < array.length; i++) {
            if (array[i] >= '0' && array[i] <= '9') {
                continue;
            } else if (array[i] == '-' || array[i] == '+') {
                signcount++;
                //正負號第二次出現時,忽略後面的字符
                if (signcount > 1) {
                    index = i;
                    break;
                }
                continue;
            } else {
                index = i;
                break;
            }
        }
        
        //截取字符串
        if (index != -1) {
            str = str.substring(0, index);
            //截取後爲空串或無效串的,返回0
            if (str.isEmpty() || str.equals("-") || str.equals("+")) {
                return 0;
            }
        }

        //數值轉換
        int result;
        try
        {
            result = Integer.parseInt(str);
            return (int)result; 
        }
        catch (NumberFormatException ex) //數值溢出的狀況
        {
            if (sign) {
                return Integer.MAX_VALUE;
            } else {
                return Integer.MIN_VALUE;
            }
        }
        catch (Exception ex) //其餘異常
        {
            return 0;
        }
    }
}

五、解題方法2

方法2是方法1的另外一種實現形式,由於方法1中採用了比較原始的方法對字符串解析,所以我想到了能夠用正則表達式直接匹配出這個數字,交給Integer.parseInt函數。

Java代碼以下:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * 功能說明:LeetCode 8 - String to Integer (atoi)
 * 開發人員:Tsybius2014
 * 開發時間:2015年7月31日
 */
public class Solution {
    
    /**
     * Atoi函數
     * @param str
     * @return
     */
    public int myAtoi(String str) {
        
        str = str.trim();

        //正則匹配
        Pattern p = Pattern.compile("^([+-]|)[0-9]+");   
        Matcher m = p.matcher(str);   
        if (m.find()) {
            str = str.substring(m.start(), m.end());
        } else {
            return 0;
        }
        
        //判斷數字的正負號
        boolean sign = true;
        if (str.charAt(0) == '-') {
            sign = false;
        }
        
        //數值轉換
        int result;
        try
        {
            result = Integer.parseInt(str);
            return (int)result; 
        }
        catch (NumberFormatException ex) //數值溢出的狀況
        {
            if (sign) {
                return Integer.MAX_VALUE;
            } else {
                return Integer.MIN_VALUE;
            }
        }
        catch (Exception ex) //其餘異常
        {
            return 0;
        }
    }
}

六、解題方法3

若是說上面兩種方法是比較偷懶的辦法,那第三種方法能夠被稱爲「正規解法」,純手工解析字符串。須要注意的是,在計算過程當中,結果須要暫時存在一個長整型(Long)類型的數據中,這樣能夠在判斷是否會有相同狀況下整型溢出的狀況,進而返回正確的返回值(Integer.MAX_VALUE或Integer.MIN_VALUE)。

Java代碼以下:

/**
 * 功能說明:LeetCode 8 - String to Integer (atoi)
 * 開發人員:Tsybius2014
 * 開發時間:2015年7月31日
 */
public class Solution {
    
    /**
     * 自制Atoi函數
     * @param str 待轉換字符串
     * @return 轉換後的數字
     */
    public int myAtoi(String str) {

        str = str.trim();

        int sign = 0; //符號:0無符號、1正、2負
        long result = 0; //計算結果
        
        for (char ch : str.toCharArray()) {
            if (ch == '+') { 
                //第一次遇到符號記錄,第二次遇到符號忽略
                if (sign != 0) { 
                    break;
                }
                sign = 1;
            } else if (ch == '-') { 
                if (sign != 0) {
                    break;
                }
                sign = -1;
            } else if (ch >= '0' && ch <= '9') { 
                //遇到數字,還要檢查是否超過了整型的最大值
                result *= 10;
                result += (ch - '0');
                if (result > Integer.MAX_VALUE) {
                    if (sign >= 0) {
                        return Integer.MAX_VALUE;
                    } else {
                        return Integer.MIN_VALUE;
                    }
                }
            } else { 
                //遇到其餘字符直接退出循環
                break;
            }
        }
        
        if (sign >= 0) {
            return (int)result;
        } else {
            return (int)-result;
        }
    }
}

END

相關文章
相關標籤/搜索