java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要介绍了 java 中字符串转整数及 MyAtoi 方法的实现的相关资料, 需要的朋友可以参考下
java 中字符串转整数及 MyAtoi 方法的实现
该题虽然和我们正常使用的字符串转整数的 API 中函数不一致,但是通过增加了很多额外的边界或者异常处理,可以锻炼算法思维的敏锐性和处理边界异常等问题的能力。
思路:字符串题一般考查的都是边界条件、特殊情况的处理。所以遇到此题一定要问清楚各种条件下的输入输出应该是什么样的。
这里已知的特殊情况有:
先来几组测试用例:
- " 010"
- " +004500"
- " -001+2a42"
- " +0 123"
- "-2147483648"
- "2147483648"
- " - 321"
- " -11919730356x"
- "9223372036854775809"
以上的测试用例对应的正确输出如下:
- 10
- 4500
- -1
- 0
- -2147483648
- 2147483647
- 0
- -2147483648
- 2147483647
Java 实现代码如下:
- 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 循环如下:
- 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://www.phperz.com/article/17/1230/356995.html