请你来实现⼀个 myAtoi(string s) 函数,使其能将字符串转换成⼀个 32 位有符号整数(类似C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
注意:
示例1:
输⼊:s = "42"
输出:42
解释:加粗的字符串为已经读⼊的字符,插⼊符号是当前读取的字符。
示例2:
输⼊:s = " -42"
输出:-42
解释:
示例3:
输⼊:s = "4193 with words"
输出:4193
解释:
示例4:
输⼊:s = "words and 987"
输出:0
解释:
示例5:
输⼊:s = "-91283472332"
输出:-2147483648
解释:
提示:
这道题⽬看起来很⻓,但是实际上逻辑很清晰,就是将字符串解析成为数字,⾥⾯有⼏个特殊的则:
在将字符串转换成数字的时候,⽤下⾯这句核⼼代码:
sum = sum * 10 + (str.charAt(i) - '0');
但是在这个过程中,我们依然需要考虑数字溢出的问题,针对这种情况,我们可以在加和之前判断,针对⼤于0的情况,如果⼤于最⼤值整除10,或者等于最⼤值整除10,但是个位数超过了,都直接返回0。
假设最⼤值是127,那么sum如果⼤于12,肯定会超过,如果sum == 12,但是个位数⼤于7,乘以10相加,也肯定会超。
if (sum > Integer.MAX_VALUE/10 || (sum == Integer.MAX_VALUE / 10 &&
(str.charAt(i) - '0') > 7)) return 0;
对于⼩于0 的情况,假设最⼩值是-128 ,那么sum 是数字部分 128 , 如果当前sum ⼤于 12 ,那么就⼀定超出,或者sum == 12 ,但是个位数⼤于8 ,乘以10 ,相加也会⼤于128 ,不符合要求,所以直接返回0 。
if (sum 8)) return 0;
具体代码实现:
public class Solution {
public static int myAtoi(String str) {
if (str == null) {
return 0;
}
int i = 0;
while (i = str.length() || (str.charAt(i) != '-' && str.charAt(i) != '+' && !((str.charAt(i) >= '0') &&
(str.charAt(i) = '0' && str.charAt(i) Integer.MAX_VALUE / 10 || sum == Integer.MAX_VALUE / 10 && (str.charAt(i) - '0') > 7) {
return Integer.MAX_VALUE;
}
} else {
if (sum > (Integer.MAX_VALUE) / 10 || sum ==
(Integer.MAX_VALUE) / 10 && (str.charAt(i) - '0') > 8) {
return Integer.MIN_VALUE;
}
}
sum = sum * 10 + (str.charAt(i) - '0');
} else {
return sum * sign;
}
}
return sum * sign;
}
}
使用正则表达式来匹配数字模式,代码更加简洁
public class Solution {
public int myAtoi(String s) {
if (s == null) return 0;
s = s.trim();
if (s.length() == 0) return 0;
// 使用正则表达式匹配数字模式:可选符号位+数字[3](@ref)
Pattern pattern = Pattern.compile("^[+-]?\d+");
Matcher matcher = pattern.matcher(s);
if (!matcher.find()) {
return 0; // 没有匹配到数字模式
}
String numStr = matcher.group();
int sign = 1;
int startIndex = 0;
// 处理符号位
if (numStr.charAt(0) == '+') {
startIndex = 1;
} else if (numStr.charAt(0) == '-') {
sign = -1;
startIndex = 1;
}
long result = 0; // 使用long防止转换过程中溢出
// 转换数字部分
for (int i = startIndex; i Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (sign == -1 && -result
本文来自在线网站:seven的菜鸟成长之路,作者:seven,转载请注明原文链接:www.seven97.top
登录查看全部
参与评论
手机查看
返回顶部