問題描述:
實現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)); } } }