力扣题目
解题思路
java代码
力扣题目:
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s)
的算法如下:
- 空格:读入字符串并丢弃无用的前导空格(
" "
) - 符号:检查下一个字符(假设还未到字符末尾)为
'-'
还是'+'
。如果两者都不存在,则假定结果为正。 - 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
- 舍入:如果整数数超过 32 位有符号整数范围
[−231, 231 − 1]
,需要截断这个整数,使其保持在这个范围内。具体来说,小于−231
的整数应该被舍入为−231
,大于231 − 1
的整数应该被舍入为231 − 1
。
返回整数作为最终结果。
示例 1:
输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
带下划线线的字符是所读的内容,插入符号是当前读入位置。 第 1 步:"42"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"42"(读入 "42") ^
示例 2:
输入:s = " -042"
输出:-42
解释:
第 1 步:" -042"(读入前导空格,但忽视掉) ^ 第 2 步:" -042"(读入 '-' 字符,所以结果应该是负数) ^ 第 3 步:" -042"(读入 "042",在结果中忽略前导零) ^
示例 3:
输入:s = "1337c0d3"
输出:1337
解释:
第 1 步:"1337c0d3"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"1337c0d3"(当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"1337c0d3"(读入 "1337";由于下一个字符不是一个数字,所以读入停止) ^
示例 4:
输入:s = "0-1"
输出:0
解释:
第 1 步:"0-1" (当前没有读入字符,因为没有前导空格) ^ 第 2 步:"0-1" (当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"0-1" (读入 "0";由于下一个字符不是一个数字,所以读入停止) ^
示例 5:
输入:s = "words and 987"
输出:0
解释:
读取在第一个非数字字符“w”处停止。
解题思路:
- 我们首先定义一个
long
类型的变量num
来存储转换后的数字,以防止在转换过程中发生溢出。 - 使用变量
i
来遍历字符串s
,并跳过前导空格。 - 检查字符串的第一个非空格字符是否是
'-'
或'+'
,以确定数字的正负性,并相应地更新flag
变量。 - 跳过前导的
'0'
字符,以便我们可以正确地处理像"005"
这样的字符串。 - 从当前位置开始,遍历字符串并转换每个数字字符,直到遇到非数字字符为止。
- 在每次转换之前,检查乘以
10
后的num
是否会导致溢出。如果flag
为正且num
大于Integer.MAX_VALUE
,或者flag
为负且num
大于Integer.MIN_VALUE
的绝对值,则返回相应的Integer.MAX_VALUE
或Integer.MIN_VALUE
。 - 最后,将
num
乘以flag
并转换为int
类型返回。由于之前的检查,这个转换不会溢出
java代码:
package org.example.mouth7.taday18;
import java.lang.String;
public class Leetcode8 {
public static void main(String[] args) {
System.out.println(myAtoi("-91282"));
}
public static int myAtoi(String s) {
// 将结果先声明为 long 类型,long long 不是 Java 中的有效类型
long num = 0;
int n = s.length();
// 跳过前导空格
int i = 0;
while (i < n && s.charAt(i) ==' ') {
i++;
}
if (i == n) {
return 0;
}
// 判断正负,flag 用于最后与 num 相乘作为结果
int flag = 1;
if (s.charAt(i) == '-') {
flag = -1;
i++;
} else if (s.charAt(i) == '+') {
i++;
}
// 跳过前导 0
while (i < n && s.charAt(i) == '0') {
i++;
}
if (i == n) {
return 0;
}
// 开始读取数字
for (; i < n; i++) {
char c = s.charAt(i);
// 遇到除数字外的字符退出
if (c < '0' || c > '9') {
break;
}
// 得到无符号的新数字
num = num * 10 + (c - '0');
// 看带符号的新数字是否溢出或者到达最大/最小
long v = num * flag;
if (v >= Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (v <= Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
}
// 最终结果强转为 int 类型返回
return (int) (num * flag);
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项