【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 ...