这是悦乐书的第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))的更多相关文章

  1. 【LeetCode每天一题】String to Integer (atoi)(字符串转换成数字)

    Implement atoi which converts a string to an integer.The function first discards as many whitespace ...

  2. 【Leetcode】【Easy】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)

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

  4. LeetCode 8. 字符串转换整数 (atoi)(String to Integer (atoi))

    8. 字符串转换整数 (atoi) 8. String to Integer (atoi) 题目描述 LeetCode LeetCode8. String to Integer (atoi)中等 Ja ...

  5. Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串)

    Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串) 题目描述 实现atoi函数,将一个字符串转化为数字 测试样例 Input: "42&q ...

  6. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  7. [leetcode] 8. String to Integer (atoi) (Medium)

    实现字符串转整形数字 遵循几个规则: 1. 函数首先丢弃尽可能多的空格字符,直到找到第一个非空格字符. 2. 此时取初始加号或减号. 3. 后面跟着尽可能多的数字,并将它们解释为一个数值. 4. 字符 ...

  8. 【leetcode】String to Integer (atoi)

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

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

随机推荐

  1. 【博弈论】hihocoder

    #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样 ...

  2. jboss7的JAX-WS客户端

    jboss版本 jboss-eap-6.1, 实际上就是jboss-as-7.x.fianal 本篇讨论使用jboss7自带的cxf库,使用wsdl文件生成和部署jax-ws的客户端程序. 首先明确一 ...

  3. ios图片瀑布流代码

    ios瀑布流,实现简单的瀑布流视图布局,可以显示网络图片,下拉刷新,上拉加载更多. 下载:http://www.huiyi8.com/sc/9087.html

  4. Cocos2d-x中锚点的介绍

    什么是锚点?  只需要记住一句话就可以,锚点就是你指定的那个坐标究竟是图像的哪个点,也就是你setPosition的坐标 eg: 新建工程:在HelloWorld中写上如下代码: CCSprite * ...

  5. CSS实现简单无缝滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. robotium 测试APK<一> 建立测试工程

    1.准备Android开发环境 2.准备签名工具http://www.troido.de/re-sign.jar 1.建立测试工程 打开Eclipse,点击File->New一个Android ...

  7. AtCoder Grand Contest 028 A:Two Abbreviations

    题目传送门:https://agc028.contest.atcoder.jp/tasks/agc028_a 题目翻译 给你两个串\(s\)与\(t\),长度分别为\(n,m\).问你存不存在一个串长 ...

  8. jquery中attr() & prop() 的区别与其实现方法

    $(function(){ $('#check').attr('checked'); // undefind ???一头雾水 }) 在jquery中 attr 本来就是用来设置或者获取属性的,可是上面 ...

  9. Object中的方法

    1.equals() 2.toString() package com_package1; public class Person44 { private int age; public int ge ...

  10. Balloon Comes! hdu(小数位数处理)

    Balloon Comes! Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...