【LintCode】转换字符串到整数
问题描述:
实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。
样例
"10" =>10
"-1" => -1
"123123123123123" => 2147483647
"1.0" => 1
问题分析:
这道题特别恶心,虽然思路很简单,但是它却表述不清。经过若干次失败的尝试,终于明白了它的含义。大概有以下几种注意情况:
(一).""的话返回0。
(二).字符串两边有空格自动屏蔽,有小数点小数点后面的内容舍弃。
(三)."+123"和"123"效果一样。
(四)."a...","-h..."这种,除了符号位只要非数字打头,返回0。
(五)."123gdah3423","-123ff777"这种返回123,-123。
(六).超了范围之后,判断正负性。
问题求解:
public class Solution {
    /**
     * @param str: A string
     * @return An integer
     */
       public int atoi(String str) {
        // 去除小数位和两边的空格,存在str1中
        String str1 = null;
        // 后面数字和非数字混合的情况,用于截取前面的数字
        StringBuilder sb = new StringBuilder();
        if (str.contains(".")) {
            str1 = str.substring(0, str.indexOf(".")).trim();
        } else {
            str1 = str.trim();
        }
        try {
            if ("".equals(str1)) {
                return 0;
            }
            return Integer.parseInt(str1);
        } catch (NumberFormatException e) {
            /*
             * 先进行判断,字符串前面是否有"+"和"-",分三种情况
             */
            //1.前面既没有"+"也没有"-"
            if (str1.charAt(0) != '-' && str1.charAt(0) != '+') {
                processData(0, str1, sb);
                if (sb.length() == 0) {// 第一个是非数字
                    return 0;
                } else if (sb.length() < str1.length()) {// 数字中夹杂非数字
                    return atoi(sb.toString());
                } else {// 全是数字
                    return Integer.MAX_VALUE;
                }
            //2.前面是"+"
            } else if (str1.charAt(0) == '+') {
                processData(1, str1, sb);
                if (sb.length() == 0) {// 第一个是非数字
                    return 0;
                } else if (sb.length() < str1.length() - 1) {// 数字中夹杂非数字
                    return atoi(sb.toString());
                } else {// 全是数字
                    return Integer.MAX_VALUE;
                }
            //3.前面是"-"
            } else {
                sb.append('-');
                processData(1, str1, sb);
                if (sb.length() == 1) {// 第一个是非数字
                    return 0;
                } else if (sb.length() < str1.length()) {// 数字中夹杂非数字
                    return atoi(sb.toString());
                } else {// 全是数字
                    return Integer.MIN_VALUE;
                }
            }
        }
    }
    public void processData(int start, String str1, StringBuilder sb) {
        for (int i = start; i < str1.length(); i++) {
            if (str1.charAt(i) < '0' || str1.charAt(i) > '9') {
                break;
            }
            sb.append(str1.charAt(i));
        }
    }
}
【LintCode】转换字符串到整数的更多相关文章
- [LintCode]转换字符串到整数
		
问题描述: 实现atoi这个函数,将一个字符串转换为整数.如果没有合法的整数,返回0.如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-21 ...
 - LintCode-54.转换字符串到整数
		
转换字符串到整数 实现atoi这个函数,将一个字符串转换为整数.如果没有合法的整数,返回0.如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN( ...
 - Java中将0x开头的十六进制字符串转换成十进制整数
		
1.Integer.toString(int i) 由于input(输入数据)是以0x开头的字符串,并不是整型.因而在用 String s = Integer.toString(input); 时用会 ...
 - 编程练习------C/C++分别实现字符串与整数的转换
		
C/C++分别实现字符串与整数的转换 前提:不使用 itoa 和 atoi. 方法一.C和C++通用的一种转换手段是: 1.整数转化为字符串:采用加'0',再逆序的办法,整数加'0'就会隐性转化成ch ...
 - [PHP] 算法-将一个字符串转换成一个整数的PHP实现
		
题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...
 - python 字符串和整数,浮点型互相转换
		
在编程当中,经常要用到字符串的互相转换, 现在记录 python 里面的字符串和整数是怎么转换的. int(str) 函数将 符合整数的规范的字符串 转换成 int 型. num2 = "1 ...
 - Leetcode8--->String to Integer(实现字符串到整数的转换)
		
题目: 实现字符串到整数的转换 解题思路: 下面给出这道题应该注意的一些细节: 1. 字符串“ 123 ” = 123: 2. 字符串“+123” = 123: 3. 字符串“-12 ...
 - SQL Server日期时间格式转换字符串详解 (详询请加qq:2085920154)
		
在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...
 - SQL Server日期时间格式转换字符串
		
在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...
 
随机推荐
- eclipse打不开,报错 "java was started with exit code=13"
			
刚才打开eclipse时,出现如上的报错窗口. 1.查看java 版本,发现是1.8版本,记得自己之前手动安装的java应该是1.7或者更低的版本.让我想起之前系统总是会提醒java有更新,最近就没有 ...
 - 关于ubuntu的sources.list总结
			
一.作用 文件/etc/apt/sources.list是一个普通可编辑的文本文件,保存了ubuntu软件更新的源服务器的地址.和sources.list功能一样的是/etc/apt/sources. ...
 - Android webview通过http get下载文件下载两次的问题及解决方法
			
一.现象 一般通过Android webview进行下载文件的方法是 1.重写DownloadListener的onDownloadStart方法,在onDownloadStart方法中弹出对话框提示 ...
 - 装完Centos7提示Initial setup of CentOS Linux 7 (core)(转载)
			
http://www.th7.cn/system/lin/201603/156762.shtml
 - 纯js代码实现手风琴特效
			
我知道现在大多数前端开发人员都在使用jQuery等第三方的库来进行开发,这不仅节约了时间,也让效率大大的提高,并让公司的效益增加,何乐而不为呢? 但是,这也会有一定的缺点,比如jQ比js慢,尤其在大型 ...
 - JVM的堆(heap)、栈(stack)和方法区(method)
			
JVM主要由类加载器子系统.运行时数据区(内存空间).执行引擎以及与本地方法接口等组成.其中运行时数据区又由方法区Method Area.堆Heap.Java stack.PC寄存器.本地方法栈组成. ...
 - JS常用自定义方法
			
1,JS生成随机数方法 getRandom(100),表示生成0-100的数 function getRandom(n){ return Math.floor(Math.random()*n+1) } ...
 - SQL Server 安装 功能详解
			
安装 SQL Server 功能 在“功能选择”页上,SQL Server 功能分为以下两个主要部分:实例功能和共享功能. “实例功能”表示为每个实例安装一次的组件,这样,您将具有它们的多个副 ...
 - Ninject 学习杂记
			
IOC容器的DI实现并不依赖于方法调用拦截,而是通过DI容器内部自己通过反射的方式生成需要的类型实例,并调用实例的成员.然后再把实例返回给容器外部环境使用. Ninject本身及其扩展库,还针对特定的 ...
 - Kafka及 .NET Core 客户端
			
消息队列 Kafka 的基本知识及 .NET Core 客户端 消息队列 Kafka 的基本知识及 .NET Core 客户端 前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka ...