java中字符串轉整數及MyAtoi方法的實現
該題雖然和我們正常使用的字符串轉整數的API中函數不一致,但是通過增加了很多額外的邊界或者異常處理,可以鍛煉算法思維的敏銳性和處理邊界異常等問題的能力。
思路:字符串題一般考查的都是邊界條件、特殊情況的處理。所以遇到此題一定要問清楚各種條件下的輸入輸出應該是什么樣的。
這里已知的特殊情況有:
- 能夠排除首部的空格,從第一個非空字符開始計算
- 允許數字以正負號(+-)開頭
- 遇到非法字符便停止轉換,返回當前已經轉換的值,如果開頭就是非法字符則返回0
- 在轉換結果溢出時返回特定值,這里是最大/最小整數
先來幾組測試用例:
1
2
3
4
5
6
7
8
9
|
" 010" " +004500" " -001+2a42" " +0 123" "-2147483648" "2147483648" " - 321" " -11919730356x" "9223372036854775809" |
以上的測試用例對應的正確輸出如下:
1
2
3
4
5
6
7
8
9
|
10 4500 -1 0 -2147483648 2147483647 0 -2147483648 2147483647 |
Java實現代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public static int myAtoi(String str) { if (str== null ||str.length()== 0 ) return 0 ; char [] array = str.toCharArray(); long result = 0 ; // 要返回的結果result int count = 0 ; // 記錄‘+'或者‘-'出現的次數 int num = 0 ; // 判斷空格出現的位置 int flag = 1 ; // 正數還是負數 for ( int i = 0 ; i < array.length; i++) { Character c = array[i]; if (c>= '0' &&c<= '9' ){ result = result* 10 +c- '0' ; // 判斷是否溢出 if (flag== 1 &&result>Integer.MAX_VALUE){ return Integer.MAX_VALUE; } else if (flag==- 1 &&-result<Integer.MIN_VALUE) return Integer.MIN_VALUE; num++; } else if (c== ' ' &&num== 0 &&count== 0 ) continue ; else if (c== '+' &&count== 0 ){ count = 1 ; } else if (c== '-' &&count== 0 ){ flag = - 1 ; count = 1 ; } else { return ( int ) (flag*result); } } return ( int ) (flag*result); } |
在上邊的代碼中,for循環遍歷數組中,判斷某個char是否是數字,可以使用Character.isDigit(c)方法,計算result時,可以使用Character.getNumericValue(c)方法來得到某個char類型的數值,總之就是可以很方便的使用Character里邊的靜態方法。
重寫的for循環如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
for ( int i = 0 ; i < array.length; i++) { Character c = array[i]; if (Character.isDigit(c)){ result = result* 10 +Character.getNumericValue(c); if (flag== 1 &&result>Integer.MAX_VALUE){ return Integer.MAX_VALUE; } else if (flag==- 1 &&-result<Integer.MIN_VALUE) return Integer.MIN_VALUE; num++; } else if (Character.isSpaceChar(c)&&num== 0 &&count== 0 ) continue ; else if (c== '+' &&count== 0 ){ count = 1 ; } else if (c== '-' &&count== 0 ){ flag = - 1 ; count = 1 ; } else { return ( int ) (flag*result); } } |
當面試時被問到這個題,我們可以不慌不亂的和面試官親切交談,制定該函數的一些規則,即如何處理異常輸入等,之后,再遍歷數組,根據需求進行相應的異常處理哦~
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/qq_25827845/article/details/72353770