题目

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want
a challenge, please do not see below and ask yourself what are the
possible input cases.

Notes:
It is intended for this problem to be specified vaguely (ie, no given
input specs). You are responsible to gather all the input requirements
up front.

spoilers alert... click to show requirements for atoi.

Requirements for atoi:

The function first discards as many whitespace characters as
necessary until the first non-whitespace character is found. Then,
starting from this character, takes an optional initial plus or minus
sign followed by as many numerical digits as possible, and interprets
them as a numerical value.

The string can contain additional characters after those that form
the integral number, which are ignored and have no effect on the
behavior of this function.

If the first sequence of non-whitespace characters in str is not a
valid integral number, or if no such sequence exists because either str
is empty or it contains only whitespace characters, no conversion is
performed.

If no valid conversion could be performed, a zero value is returned.
If the correct value is out of the range of representable values,
INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.

题解

这题主要就是考虑一下corner case。

越界问题?

正负号问题?

空格问题?

精度问题?

代码如下:

 1    public int atoi(String str) {
 2     if (str == null || str.length() < 1)
 3         return 0;
 4  
 5     // trim white spaces
 6     str = str.trim();
 7  
 8     char flag = '+';
 9  
     // check negative or positive
     int i = 0;
     if (str.charAt(0) == '-') {
         flag = '-';
         i++;
     } else if (str.charAt(0) == '+') {
         i++;
     }
     // use double to store result
     double result = 0;
  
     // calculate value
     while (str.length() > i && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
         result = result * 10 + (str.charAt(i) - '0');
         i++;
     }
  
     if (flag == '-')
         result = -result;
  
     // handle max and min
     if (result > Integer.MAX_VALUE)
         return Integer.MAX_VALUE;
  
     if (result < Integer.MIN_VALUE)
         return Integer.MIN_VALUE;
  
     return (int) result;
 }

更新:

因为遇见过了atol,string to long 这样的问题,就不能用这种比当前数据类型长的方法解决。

另一种方法是更加普遍和巧妙的,就是用这样的判断:

1. Integer.MAX_VALUE/10 < result; //当前转换结果比Integer中最大值/10还大(因为这个判断放在while循环最开始,之后还要对result进行*10+当前遍历元素的操作,所以如果还乘10的result已经比Integer.MAX_VALUE/10还大,可想而知,乘了10更大)

2. Integer.MAX_VALUE/10 == result && Integer.MAX_VALUE%10 <(str.charAt(i) - '0') //另外的情况就是,当前result恰跟 Integer.MAX_VALUE/10相等,那么就判断当前遍历的元素值跟最大值的最后一位的大小关系即可

代码如下:

 1   public int atoi(String str) {
 2     if (str == null || str.length() < 1)
 3         return 0;
 4  
 5     // trim white spaces at beginning and end
 6     str = str.trim();
 7  
 8     char flag = '+';
 9  
     // check negative or positive
     int i = 0;
     if (str.charAt(0) == '-') {
         flag = '-';
         i++;
     } else if (str.charAt(0) == '+') {
         i++;
     }
     // use double to store result
     int result = 0;
  
     // calculate value
     while (str.length() > i && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
         if(Integer.MAX_VALUE/10 < result || (Integer.MAX_VALUE/10 == result && Integer.MAX_VALUE%10 < (str.charAt(i) - '0'))) 
             return flag == '-' ? Integer.MIN_VALUE : Integer.MAX_VALUE;
             
         result = result * 10 + (str.charAt(i) - '0');
         i++;
     }
  
     if (flag == '-')
         result = -result;
  
     return result;
 }

Reference: http://www.programcreek.com/2012/12/leetcode-string-to-integer-atoi/

String to Integer (atoi) leetcode java的更多相关文章

  1. String to Integer (atoi) leetcode

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  2. String to Integer (atoi) ---- LeetCode 008

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  3. 8. String to Integer (atoi) ---Leetcode

    Implement atoi to convert a string to an integer. 题目分析: 题目本身很简单就是将一个字符串转化成一个整数,但是由于字符串的千差万别,导致在实现的时候 ...

  4. LeetCode 8. 字符串转换整数 (atoi)(String to Integer (atoi))

    8. 字符串转换整数 (atoi) 8. String to Integer (atoi) 题目描述 LeetCode LeetCode8. String to Integer (atoi)中等 Ja ...

  5. LeetCode【8】. String to Integer (atoi) --java实现

    String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...

  6. leetcode第八题 String to Integer (atoi) (java)

    String to Integer (atoi) time=272ms   accepted 需考虑各种可能出现的情况 public class Solution { public int atoi( ...

  7. LeetCode: String to Integer (atoi) 解题报告

    String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...

  8. leetcode day6 -- String to Integer (atoi) &amp;&amp; Best Time to Buy and Sell Stock I II III

    1.  String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully con ...

  9. Kotlin实现LeetCode算法题之String to Integer (atoi)

    题目String to Integer (atoi)(难度Medium) 大意是找出给定字串开头部分的整型数值,忽略开头的空格,注意符号,对超出Integer的数做取边界值处理. 方案1 class ...

随机推荐

  1. JS中sort()方法原理及使用

    说明 如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. arra ...

  2. 【mongo】登陆报错

    今天登陆mongo时出现了错误 Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt fa ...

  3. 自己理解Java中的lambda

    lambda是什么 "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lam ...

  4. linux 取消笔记本触摸键

    关闭触摸 sudo rmmod psmouse 关闭触摸和按键 sudo modprobe -r psmouse 打开 sudo modprobe psmouse

  5. window 连linux

    https://blog.csdn.net/ruanjianruanjianruan/article/details/46954681 https://blog.csdn.net/u013754317 ...

  6. Ajax和JSON完成二级菜单联动的功能

    首先需要找好JSON的包哦: 链接:http://pan.baidu.com/s/1jH6gN46 密码:lbh1 1:首先创建一个前台页面,比如secondMenu.jsp,源码如下所示: < ...

  7. 谈谈java多线程(一)

    其实很早就想写一些java多线程方面的文章,只是奈何这东西看着简单,但要真要理解和正确使用可能还需要花费一定的精力,虽然平时的工作中会用到这方面的知识,可是更多的只是为了完成工作,至于详细的东西,也没 ...

  8. 项目部署到liunx环境下访问接口返回异常

    1.访问接口返回异常 已经连续踩了两次这个坑了.所以记下来了.方便下次搜索! 项目在window下运行正常,无任何异常! 但是部署到liunx环境下的服务器上就有问题 访问静态页面毫无问题,一旦涉及到 ...

  9. echarts 折线统计笔记

    效果案例图 需要引入的js文件可以直接去官网下载 下面是代码 <!--第一步: 引入 ECharts 文件 --> <script src="static/js/myjs/ ...

  10. Redis数据结构之set

    一:介绍 1.set结构 没有顺序 并且,不允许出现重复的元素. 二:Redis客户端的常用命令 1.添加 2.查看数据 3.删除数据 4.是否存在某个值 1代表有,0代表无. 5.查看差值 有key ...