这是悦乐书的第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. POJ - 1321 棋盘问题 【DFS】

    题目链接 http://poj.org/problem?id=1321 思路 和N皇后问题类似 但是有一点不同的是 这个是只需要摆放K个棋子就可以了 所以 我们要做好 两个出口 并且要持续往下一层找 ...

  2. BZOJ 1196 [HNOI2006]公路修建问题:二分 + 贪心生成树check(类似kruskal)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题意: n个城市,m对城市之间可以修公路. 公路有两种,一级公路和二级公路,在第i对 ...

  3. 详解C/C++ 编译 g++ gcc 的区别

    我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++, 或者说编译用gcc,链 接用g++,一时也不知哪个说法正确,如果再遇上个ex ...

  4. 【C++基础】重载,覆盖,隐藏

    函数签名的概念 函数签名主要包括1.函数名:2.参数列表(参数的个数.数据类型和顺序):但是注意,C++官方定义中函数签名不包括返回值!! 1.重载 函数重载是指在同一作用域内,可以有一组具有相同函数 ...

  5. 洛谷P3373线段树模板2

    题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...

  6. 利用MEF实现插件机制(可根据输入类型来加载特定dll)

    最近在做PACS的项目中想利用插件来加载各个不同的SCP的操作实现.比如Worklist的查询数据库,可以有多个实现. 比如MPPS的更新,也可以有多个实现. 为了统一弹性处理插件模块,增加了类型输入 ...

  7. Day04:函数参数、对象、嵌套、闭包函数和装饰器

    上节课复习:    1.什么是函数        函数就是具备某一功能的工具    2.为何用函数        1.程序的组织结构和可读性        2.减少代码冗余        3.扩展性强 ...

  8. 并查集基础 模板题 hdu1232 畅通工程

    模板题 引入并查集——一则有趣的故事 为了解释并查集的原理,我将举一个更有趣的例子.话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的 ...

  9. Java多线程运行机制的基本原理

    Java多线程运行机制的基本原理 进程和线程的区别 进程 进程是一个程序执行的实例,比如说我们打开10个IE浏览器窗口,那么就有10个进程开启.一个进程可以同时被运行若干次,进程是CPU进行资源分配和 ...

  10. MATLAB 内存容量修改 zz

    MATLAB 内存容量修改 - Oliver的日志 - 网易博客 在用MATLAB做图像处理时 经常会碰到内存溢出的情况,可用如下方法修改,使得MATLAB的内存容量最大: 出自matlab:matl ...