java中字符串转整数及MyAtoi方法的实现

所属分类: 软件编程 / java 阅读数: 28
收藏 0 赞 0 分享

java中字符串转整数及MyAtoi方法的实现

       该题虽然和我们正常使用的字符串转整数的API中函数不一致,但是通过增加了很多额外的边界或者异常处理,可以锻炼算法思维的敏锐性和处理边界异常等问题的能力。


思路:字符串题一般考查的都是边界条件、特殊情况的处理。所以遇到此题一定要问清楚各种条件下的输入输出应该是什么样的。

这里已知的特殊情况有:

  • 能够排除首部的空格,从第一个非空字符开始计算
  • 允许数字以正负号(+-)开头
  • 遇到非法字符便停止转换,返回当前已经转换的值,如果开头就是非法字符则返回0
  • 在转换结果溢出时返回特定值,这里是最大/最小整数

先来几组测试用例:

"  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); 
         
      } 
    } 

        当面试时被问到这个题,我们可以不慌不乱的和面试官亲切交谈,制定该函数的一些规则,即如何处理异常输入等,之后,再遍历数组,根据需求进行相应的异常处理哦~

       感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多