题目

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. 多CPU,多核,多进程,多线程

    当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位(调度单位). 3.一个进程可以包括多个线程. 4.在 ...

  2. java util Aarrys 类

    toString方法  产生一维数组的二维版本 public static String toString(type[] a) { //type 是传入数据类型 if (a == null) retu ...

  3. php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)

    1.电子邮件地址的校验 <?php /* 校验邮件地址*/ function checkMail($email) { //用户名,由“w”格式字符.“-”或“.”组成 $email_name= ...

  4. python----多继承C3算法

    https://blog.csdn.net/fmblzf/article/details/52512145

  5. cf220B莫队

    用莫队比直接做快了很多.. #include<iostream> #include<cstring> #include<cstdio> #include<cm ...

  6. MarkDown常用语法及word转MarkDown

    介绍 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成. ...

  7. 安卓在代码中设置TextView的drawableLeft、drawableRight、drawableTop、drawableBottom

    Drawable rightDrawable = getResources().getDrawable(R.drawable.icon_new); //调用setCompoundDrawables时, ...

  8. H 模拟水题

    n个人 小明编号为m 从编号为a的人开始数 起始数字为b 遇到素数duang 并反相 求小明应该说什么 Sample Input 310 2 //n m3 4 //a b3 32 64 13 8 Sa ...

  9. #9 //[SDOI2017]新生舞会

    题解: 分数规划+费用流 常数巨大开o2加inline加register还是不行 我也不知道为什么 代码: #include <bits/stdc++.h> using namespace ...

  10. A. 【UNR #2】UOJ拯救计划

    题解: 感觉多了解一些npc问题是很有用的.. 就不会像我一样完全不考虑模数的性质 前面60分大概是送分 后面主要考虑一下%6带来的影响 平常都是那么大的模数,突然这么小??? 考虑正好使用k种颜色的 ...