public static int myAtoi(String s) {
s = s.trim();
if (s == null) {
return 0;
}
if (s.isEmpty()){
return 0;
}
char charStr = s.charAt(0);
int count = 0;
int sign = 1;
if (charStr == '+'){
count ++;
}else if (charStr == '-'){
sign = -1;
count ++;
}else if (!Character.isDigit(charStr)){
return 0;
}
long num = 0;
long res = num * sign ;
while (count < s.length() && Character.isDigit(s.charAt(count))){
num = num * 10 + Integer.parseInt(String.valueOf(s.charAt(count)));
res = num * sign;
if (res > Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}
if (res < Integer.MIN_VALUE){
return Integer.MIN_VALUE;
}
count++;
}
return (int) num * sign;
}
代码解释:
1. 首先,对输入的字符串进行修整,去除首尾的空格。如果修整后的字符串为null,返回0。
2. 如果修整后的字符串为空,也返回0。
3. 获取修整后字符串的第一个字符。
4. 初始化计数器count为0,符号sign为1。
5. 如果第一个字符是'+',则计数器count加1。
6. 如果第一个字符是'-',则将符号sign设为-1,计数器count加1。
7. 如果第一个字符不是数字,则返回0。
8. 初始化变量num和res为0,res存储最终结果。
9. 当计数器count小于字符串长度且当前字符是数字时,进入循环。
10. 将num乘以10并加上当前字符对应的数字,更新num的值。
11. 将res设置为num乘以符号sign。
12. 如果res大于整型的最大值(Integer.MAX_VALUE),返回Integer.MAX_VALUE。
13. 如果res小于整型的最小值(Integer.MIN_VALUE),返回Integer.MIN_VALUE。
14. 计数器count加1。
15. 循环结束后,返回res的整型值乘以符号sign。
这段代码的作用是将字符串转换为整数,并且处理了一些异常情况,例如字符串为空、不包含数字等。
2、long num = 0;
long res = num * sign ; 为什么使用long 而不是int
问题解释:
在这段代码中,使用 long 类型是为了防止整数溢出的情况发生。
在字符串转换为整数的过程中,可能会出现结果超过 int 类型的取值范围的情况。为了确保结果的准确性,可以使用 long 类型来存储中间结果和最终结果。通过使用 long 类型,可以处理更大范围的整数值,避免溢出。
在代码的最后,将 long 类型的结果强制转换为 int 类型返回,因为方法的返回类型是 int 。
总之,使用 long 类型是为了增加代码的健壮性和准确性,以处理可能出现的整数溢出情况。