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