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 ...
随机推荐
- Java多线程系列 基础篇07 synchronized底层优化
转载 http://www.cnblogs.com/paddix/ 作者:liuxiaopeng http://www.infoq.com/cn/articles/java-se-16-synchro ...
- POJ 3071 Football:概率dp
题目链接:http://poj.org/problem?id=3071 题意: 给定n,有2^n支队伍参加足球赛. 给你所有的p[i][j],表示队伍i打败队伍j的概率. 淘汰赛制.第一轮(1,2)两 ...
- RQNOJ 57 找啊找啊找GF:01背包
题目链接:https://www.rqnoj.cn/problem/57 题意: sqybi在七夕这天太无聊了,所以他想去给自己找GF. 总共有n个MM. 搞定第i个MM要花费rmb[i]块大洋.rp ...
- 分享知识-快乐自己:java 中的访问修饰符
1):Java中的访问修饰符: Java面向对象的基本思想之一是封装细节并且公开接口.Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节. 访问控制 ...
- 分享知识-快乐自己:Hibernate框架常用API详解
1):Configuration配置对象 Configuration用于加载配置文件. 1): 调用configure()方法,加载src下的hibernate.cfg.xml文件 Configura ...
- 【boost】ptree 读写中文的问题
最经项目中使用到了boost property_tree,却在中文问题上遇到大问题. 直接使用ptree读写存储于窄字符(如string)类型的中文字符串时,程序可以运行,但由于XML默认使用UTF- ...
- dynamic 作为参数传入另一个程序集,获取值
dynamicOBJ.GetType().GetProperty("key").GetValue(dynamicOBJ, null)
- 如何在Mac下显示Finder中的所有文件
在Unix下工作,你可能需要处理一些“特殊“文件或文件夹,例如/usr,/bin, etcf,或一些"dot files"(如.bash_profile).但是Linux/Unix ...
- Set_ML
参考资料:斯坦福(http://cs231n.github.io/linear-classify/:http://cs231n.stanford.edu/slides/2017/) Mastering ...
- mysql备份并升级sql语句
#!/bin/bash ' time=`date +%Y%m%d-%H%M` db_path=/root/code/xizang_PAD_project/PHP_business_server/tfc ...