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.

抠细节的题目,特别是 Integer.MIN_VALUE 与 Integer.MAX_VALUE的绝对值并不一样大. 一般要分开处理,但我这里16-17行统一处理也是可行的,原因在于用的是>号,当res 绝对值为2147483647时,给res加正号或者加负号都是可以的,不需要特殊处理;只有当res绝对值为2147483648或更大时才需要特别处理,如果是正数则处理为Integer.MAX_VALUE,如果是负数则处理为Integer.MIN_VALUE(与直接给2147483648加上负号效果一样)。整数一般有两点,一个是正负符号问题,另一个是整数越界问题。

 public class Solution {
public int atoi(String str) {
int res = 0;
if (str==null || str.length()==0) return res;
str = str.trim();
if (str.length() == 0) return res;
boolean isNeg = false;
for (int i=0; i<str.length(); i++) {
if (i == 0 && str.charAt(i) == '+') continue;
else if (i == 0 && str.charAt(i) == '-') {
isNeg = true;
continue;
}
else if (str.charAt(i)>='0' && str.charAt(i)<='9') {
int digit = (int)(str.charAt(i) - '0');
if (res > (Integer.MAX_VALUE - digit) / 10) {
return isNeg? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
res = res * 10 + digit;
}
else break;
}
return isNeg? -res : res;
}
}

转载一个不错的解法(跟我差不多):

 public int atoi(String str) {
if(str==null)
{
return 0;
}
str = str.trim();
if(str.length()==0)
return 0;
boolean isNeg = false;
int i = 0;
if(str.charAt(0)=='-' || str.charAt(0)=='+')
{
i++;
if(str.charAt(0)=='-')
isNeg = true;
}
int res = 0;
while(i<str.length())
{
if(str.charAt(i)<'0'||str.charAt(i)>'9')
break;
int digit = (int)(str.charAt(i)-'0');
if(isNeg && res>-((Integer.MIN_VALUE+digit)/10))
return Integer.MIN_VALUE;
else if(!isNeg && res>(Integer.MAX_VALUE-digit)/10)
return Integer.MAX_VALUE;
res = res*10+digit;
i++;
}
return isNeg?-res:res;
}

Leetcode: String to Integer的更多相关文章

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

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

  2. [LeetCode] String to Integer (atoi) 字符串转为整数

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

  3. [LeetCode]String to Integer (atoi)

    题意:字符串转正数 原题来自:https://leetcode.com/problems/string-to-integer-atoi/ 分析: <程序员面试宝典>上出现的面试题,主要是考 ...

  4. [Leetcode] String to integer atoi 字符串转换成整数

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

  5. [LeetCode] String to Integer (atoi) 字符串

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

  6. [Leetcode]String to Integer (atoi) 简易实现方法

    刚看到题就想用数组做,发现大多数解也是用数组做的,突然看到一个清新脱俗的解法: int atoi(const char *str) { ; int n; string s(str); istrings ...

  7. leetcode String to Integer (atoi) python

    class Solution(object): def myAtoi(self, str): """ :type str: str :rtype: int "& ...

  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. Git 忽略一些文件不加入版本控制

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法.这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 Git 忽略 *.a    ...

  2. Euler's totient function

    https://en.wikipedia.org/wiki/Euler's_totient_function counts the positive integers up to a given in ...

  3. Apache Kafka源码分析 - autoLeaderRebalanceEnable

    在broker的配置中,auto.leader.rebalance.enable (false) 那么这个leader是如何进行rebalance的? 首先在controller启动的时候会打开一个s ...

  4. ubuntu下各个软件完全卸载

    1.卸载mysql sudo rm /var/lib/mysql/ -R删除mysql的数据文件2sudo rm /etc/mysql/ -R删除mqsql的配置文件3sudo apt-get aut ...

  5. (转)Linux下MatlabCompilerRuntime的安装和使用

    1MCR简介 MCR之前是 Matlab Component Runtime的缩写,后更名为Matlab Compiler Runtime.MCR实际上是一组独立的共享库,也即是常说的动态连接库,所起 ...

  6. Blender to XPS(blender 2.7x Internal materials)

    Things we are gonna need are Blender 2.7x www.blender.org/ XPS tools addon for Blender A model made ...

  7. 运维技能大全 | Devops Tools 周期表

    老外整理的 Devops Tools 周期表,可以用酷炫屌炸天形容,划分了数据库.CI.日志.安全.监控.配置管理.云服务等15个大类,120个工具.我是有点孤陋寡闻,很多都没听说过,你要是全学会了你 ...

  8. Servlet Threading Model

    Servlet Threading Model The scalability issues of Java servlets are caused mainly by the server thre ...

  9. threading多线程

    什么是线程? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.一 ...

  10. Codeforces Round #376 (Div. 2)F. Video Cards(前缀和)

    题目链接:http://codeforces.com/contest/731/problem/F 题意:有n个数,从里面选出来一个作为第一个,然后剩下的数要满足是这个数的倍数,如果不是,只能减小为他的 ...