1、前言
题目描述
2、思路
这道题判断其他的东西不难,难就难在判断溢出。比较投机取巧的方法是,用大类型比如 double 去存 sum,相加的时候就不会溢出了。但这种方法不算是解决问题的思路,正确的思路是提前判断。
比如判断 int 是否会溢出,提前判断当前 sum > max / 10,如果大于,后面乘10当然会溢出。如果 sum < max / 10,后面判断个位数上的不是很好判断,所以可以转换为 sum == max / 10,然后判断个位上的数。如果当前字符比 max % 10 还大的话,那么个位数的数大于 max 的了,肯定溢出。判断 min 溢出同理。
还有一点注意的是,判断完符号后,并不需要最后才去加,可以在 sum 累加的过程中加。因为 sign 每次与单个位数相乘,然后再与 sum 相加。
3、代码
class Solution {
public int myAtoi(String s) {
if(s == null || s.length() == 0){
return 0;
}
// 去掉空格
int i = 0;
while(i < s.length() && s.charAt(i) == ' '){
i++;
}
// 如果都是空格,直接返回
if (i == s.length()) {
return 0;
}
// 判断符号
int sum = 0, sign = 1;
if(s.charAt(i) == '-'){
sign = -1;
i++;
}else if(s.charAt(i) == '+'){
i++;
}
// 遍历
for(; i < s.length(); i++){
char currentChar = s.charAt(i);
if(currentChar < '0' || currentChar > '9'){
return sum;
}
// 溢出判断小技巧,提前判断,如果此时 sum 已经大于 max / 10,说明下一次 sum * 10 一定溢出。就算 sum = max / 10,如果
// 它后面要加的数字大于 max 个位数的数,还是会溢出
if(sum > Integer.MAX_VALUE / 10 || (sum == Integer.MAX_VALUE / 10 && (currentChar - '0') > Integer.MAX_VALUE % 10)){
return Integer.MAX_VALUE;
}
if(sum < Integer.MIN_VALUE / 10 || (sum == Integer.MIN_VALUE / 10 && -(currentChar - '0') < Integer.MIN_VALUE % 10)){
return Integer.MIN_VALUE;
}
sum = sum * 10 + sign * (currentChar - '0');
}
return sum;
}
}