LeetCode.8-字符串转整数(String to Integer (atoi))
这是悦乐书的第349次更新,第374篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Medium级别的第4题(顺位题号是8)。实现将字符串转换为整数的atoi方法。
该函数首先去掉所需丢弃的空白字符,直到找到第一个非空白字符。然后,从该字符开始,采用可选的初始加号或减号,后跟尽可能多的数字,并将它们转换为整数。
字符串可以包含在形成整数之后的其他字符,这些字符将被忽略并且对此函数的行为没有影响。
如果str中的第一个非空白字符不是有效的整数,或者由于str是空的或者只包含空白字符而不存在这样的序列,则不执行转换。
如果无法执行有效转换,则返回零值。
注意:
- 只有空格字符' '被视为空格字符。
假设我们正在处理一个只能在32位有符号整数范围内存储整数的环境:[ -231,231 -1]。如果数值超出可表示值的范围,则返回INT_MAX(231-1)或INT_MIN(-231)。例如:
输入:“42”
输出:42
输入:“ -42”
输出:-42
说明:第一个非空白字符是' - ',这是减号。然后取尽可能多的数字,得到42。
输入:“4193 with words”
输出:4193
说明:转换在数字“3”处停止,因为下一个字符不是数字。
输入:“words and 987”
输出:0
说明:第一个非空白字符是'w',它不是数字或+/-符号。因此,无法执行有效转换。
输入:“-91283472332”
输出:-2147483648
说明:数字“-91283472332”超出32位有符号整数的范围。返回INT_MIN(-2^31)。
02 第一种解法
将字符串转成整数,根据题目给的说明和试错,需要考虑以下几个条件:
是否为空,或者由空格组成。
是否带有正负符号,正号可以忽略,负号在返回结果时需要带上。
以0开头,需要跳过连续的前置0。例如"000123",转换的结果是123。
超过了Integer的最大边界或最小边界。
小数点可以忽略,因为是转成整型,会舍掉小数点后面的数。
出现多个正负符号,直接返回0。例如"+-2",结果是0。
第一位只能是数字(0到9)或者正负符号,出现其他字符直接返回0。
根据上面这些情况,在关键处进行判断即可。
public int myAtoi(String str) {
str = str.trim();
// 判空
if (str.length() < 1) {
return 0;
}
// 判断首位字符
char c = str.charAt(0);
if (!Character.isDigit(c) && c != '-' && c != '+') {
return 0;
}
// 判断符号
boolean flag = false;
if (c == '-') {
flag = true;
}
int end = 0;
for (int i=1; i<str.length(); i++) {
if (Character.isDigit(str.charAt(i))) {
end = i;
} else {
break;
}
}
String newStr = str.substring(flag ? 1 : 0, end+1);
if (newStr.length() < 1 || newStr.equals("+")) {
return 0;
}
// 判断边界
if (!newStr.startsWith("0") && newStr.length() > 12) {
return flag ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
Long result = Long.parseLong(newStr);
if (result.toString().length() > 11) {
return flag ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
if (result > Integer.MAX_VALUE) {
return flag ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
return flag ? 0-(int)result.longValue() : (int)result.longValue();
}
03 第二种解法
在第一种解法的基础上,我们还可以做下优化。
public int myAtoi2(String str) {
if (str == null) {
return 0;
}
str = str.trim();
if (str.isEmpty()) {
return 0;
}
char c = str.charAt(0);
int start = 0;
if (c == '+' || c == '-') {
start = 1;
}
int end = str.length(), n = str.length();
for (int i=start; i<n; i++) {
char ch = str.charAt(i);
if ("0123456789".indexOf(ch) < 0) {
end = i;
break;
} else {
// 截取的字符串长度可能会超过Integer的边界
if (i >= 10) {
long tem = Long.valueOf(str.substring(0, i+1));
if (tem > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
} else if (tem < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
}
}
}
if (end <= start) {
return 0;
}
long result = Long.valueOf(str.substring(0, end));
if (result > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
} else if (result < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
return (int)result;
}
04 第三种解法
我们也可以不采用截取字符串的方式,通过计算每一位数,判断是否是0到9的数字,并且判断是否越界。
public int myAtoi3(String str) {
if (str == null) {
return 0;
}
str = str.trim();
if (str.isEmpty()) {
return 0;
}
int index = 0, total = 0, n = str.length();
int sign = 1;
// 判断正负
// 只判断一次,不能使用循环
if (index < n && (str.charAt(index) == '+'
|| str.charAt(index) == '-')) {
sign = str.charAt(index) == '-' ? -1 : 1;
index++;
}
// 计算整数
while (index < n) {
int num = str.charAt(index)-'0';
if (num < 0 || num > 9) {
break;
}
// 避免越界
if (total > Integer.MAX_VALUE/10 ||
(total == Integer.MAX_VALUE/10
&& num > Integer.MAX_VALUE%10)) {
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
total = total*10 + num;
index++;
}
return total*sign;
}
05 小结
算法专题目前已连续日更超过六个月,算法题文章217+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.8-字符串转整数(String to Integer (atoi))的更多相关文章
- 【LeetCode每天一题】String to Integer (atoi)(字符串转换成数字)
Implement atoi which converts a string to an integer.The function first discards as many whitespace ...
- 【Leetcode】【Easy】String to Integer (atoi)
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- 【leetcode刷题笔记】String to Integer (atoi)
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- LeetCode 8. 字符串转换整数 (atoi)(String to Integer (atoi))
8. 字符串转换整数 (atoi) 8. String to Integer (atoi) 题目描述 LeetCode LeetCode8. String to Integer (atoi)中等 Ja ...
- Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串)
Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串) 题目描述 实现atoi函数,将一个字符串转化为数字 测试样例 Input: "42&q ...
- 前端与算法 leetcode 8. 字符串转换整数 (atoi)
目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...
- [leetcode] 8. String to Integer (atoi) (Medium)
实现字符串转整形数字 遵循几个规则: 1. 函数首先丢弃尽可能多的空格字符,直到找到第一个非空格字符. 2. 此时取初始加号或减号. 3. 后面跟着尽可能多的数字,并将它们解释为一个数值. 4. 字符 ...
- 【leetcode】String to Integer (atoi)
String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...
- leetcode day6 -- String to Integer (atoi) && 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 ...
随机推荐
- NiFi汉化
①在源文件中的 source-nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src中修 ...
- 4.Web工程师的开发工具箱
第四章 效率工具ShadowSocks window代理服务器FalconProxy chrome代理服务器stackoverflow.com Stack Overflow是一个与程序相关的IT技术问 ...
- Centos虚拟机克隆后的ip配置
1. rm -rf /etc/udev/rules.d/-persistent-net.rules 2. 重启,然后: vi /etc/udev/rules.d/70-persistent-net.r ...
- PYTHON 爬虫笔记六:PyQuery库基础用法
知识点一:PyQuery库详解及其基本使用 初始化 字符串初始化 html = ''' <div> <ul> <li class="item-0"&g ...
- 详解Java异常Throwable、Error、Exception、RuntimeException的区别
在Java中,根据错误性质将运行错误分为两类:错误和异常. 在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象.生成的异常对象将传递Java运行时系统,这一异常的产生和提交过程称为抛 ...
- hdu 6103(Kirinriki)
题目链接:Kirinriki 题目描述: 找两个不重叠的字符串A,B. 使得dis(A,B)<=m;\(dis(A,B)= \sum _{i=0}^{n-1} \left | A_i-B_{n- ...
- COM组件宏观认识
一直搞不清楚COM到底是个什么东西,记录一些个人感想,可能很多错误的,慢慢消化. 一.宏观认识: 1.COM(组件对象模型)是一种标准,规则,要求,即即于建筑设计指标要求. 2.语言无关性,因为是建立 ...
- μC/OS-II与RT-Thread对比—任务调度
在任务调度器的实现上,μC/OS-II和RT-Thread都采用了位图调度(bitmap scheduling),任务优先级的值越小则代表具有越高的优先级,主要区别在于实现形式,是采用多级队列的形式, ...
- UML统一建模语UML2和EnterpriseArchitect
其实前面的UML统一建模语言(一)所描述的都是UML1的内容,现在咱们聊一聊UML2. UML2.x完全建立在UML1.x基础之上,大多数的UML1.x模型在UML2.x中都可用.但UML2.x在结构 ...
- VijosP1112:小胖的奇偶
描述 huyichen和xuzhenyi在玩一个游戏:他写一个由0和1组成的序列. huyichen选其中的一段(比如第3位到第5位),问他这段里面有奇数个1还是偶数个1.xuzhenyi回答你的问题 ...