一、題目名稱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