1. 程式人生 > >LeetCode-Algorithms #008 String to Integer(atoi), Database #183 Customers Who Never Order

LeetCode-Algorithms #008 String to Integer(atoi), Database #183 Customers Who Never Order

 LeetCode-Algorithms #008 String to Integer(atoi)

題目這裡的atoi是ASCII to Integer的意思, 所以讀作a to i可能比較合理.

給定一個字串, 將其轉換成數字, 具體規則比較繁瑣, 可以看上面圖中的例子.

題目本身是比較簡單的, 但是因為陷阱很多, 需要注意的地方也很多, 所以如果想要一次通過就非常困難, 我自己是反覆修改了很多次:

 1 class Solution {
 2     public int myAtoi(String str) {
 3         //如果原字串是null, 就直接返回0
 4         if
(str == null) 5 return 0; 6 //去掉原串前面的空格 7 //這裡直接用trim實際上是比較犯規的,但是有點懶得寫了 8 str = str.trim(); 9 //去掉空格後如果變成了空串, 就直接返回0 10 if (str.length() == 0) 11 return 0; 12 //建立一個sign表示正負號 13 int sign = 1; 14 //此時如果字串以-/+開頭就記錄下符號然後把符號去掉
15 if (str.charAt(0) == '-') { 16 sign = -1; 17 str = str.substring(1); 18 if (str.length() == 0) 19 return 0; 20 } else if (str.charAt(0) == '+') { 21 sign = 1; 22 str = str.substring(1); 23 if (str.length() == 0)
24 return 0; 25 } 26 //此時字串如果以0開頭,就把這些0去掉 27 while (str.length() > 0 && str.charAt(0) == '0') { 28 str = str.substring(1); 29 } 30 //此時如果字串變成了空串,就直接返回0 31 if (str.length() == 0) 32 return 0; 33 //此時如果字串以數字開頭,則繼續判斷,以其他字元開頭就直接返回0 34 if (str.charAt(0) >= '0' && str.charAt(0) <= '9') { 35 //將此時的字串轉換為字元陣列 36 char[] arr = str.toCharArray(); 37 //建立一個StringBuilder物件儲存結果 38 StringBuilder sb = new StringBuilder(); 39 //對字元陣列進行遍歷, 如果遍歷到第11位仍是數字, 則必然已經超過32位整數的取值範圍,可以停止遍歷 40 //這樣做的另一個好處是可以避免超過long的取值範圍 41 for (int i = 0; i < arr.length && i < 11; i++) { 42 //如果字元陣列相應位置是數字,就新增到結果中 43 if (arr[i] >= '0' && arr[i] <= '9') { 44 sb.append(arr[i]); 45 } else { //如果出現不是數字的字元,就停止遍歷 46 break; 47 } 48 } 49 //將結果轉換成字串 50 String s = sb.toString(); 51 //用一個long值接收字串轉換的結果, 再乘以之前記錄下的符號 52 long ans = Long.parseLong(s) * sign; 53 //對結果進行判斷, 如果超過int的取值範圍, 就直接返回上/下界 54 if (ans > Integer.MAX_VALUE) 55 return Integer.MAX_VALUE; 56 if (ans < Integer.MIN_VALUE) 57 return Integer.MIN_VALUE; 58 //否則就強轉為int返回結果 59 return (int) ans; 60 } else { 61 //其他非法結果直接返回0 62 return 0; 63 } 64 } 65 }

可以看出, 需要進行判斷和注意的地方相當多, 第一次就能夠在面對諸如" ", "20000000000000000000000000000000000000", "+1", "000000000000012345678"等等input時都作出正確的判斷真是不容易(嗯, 前面這幾個坑每一個我都掉進去了