如何处理溢出情况是本题的难点,通过举一个例子来表达关键代码处的思路。
如果问题背景变成如下:正确的数字范围是-128~127,待分析字符串是-134和129。
1. 重新设置边界。当待分析字符串为负数时 limit = -128; 当待分析字符串为正数时 limit = -127。(注意待分析字符串为正数时,边界limit被故意定义为了负数)
2. 分析-134时,关键代码第一行中的判断条件 limit / 10 = -12;此时result = 0。
(1)“-” :此时result = 0; 确定是负数
(2)"1”: 0 > -12 ---------> 此时result = 0; 可以添加
(3)"3”: -1 > -12 --------->此时result = -1; 可以添加
(4)"4”: -13 < -12 ---------> 此时result = -13; 不可以添加(数字有n位,若result的前n - 1位 < 边界的前n - 1位,则无论第n位加上什么,都会超出边界)
3. 分析129时,关键代码第一行中的判断条件 limit / 10 = -12;此时result = 0。
(1)"1”: 0 > -12 ---------> 此时result = 0; 可以添加
(2)"2”: -1 > -12 ---------> 此时result = -1; 可以添加
(3)"9”: -12 == -12 && (result乘以十)-120 < (边界) -127 + (第n位) 9 ---------> 此时result = -12; 不可以添加(数字有n位,虽然前n - 1位都是正常的,但加上第n位的数可能超出边界)
public int StrToInt(String str) {
if (str == null || str.length() == 0 || str == "+" || str == "-") return 0;
int limit = -Integer.MAX_VALUE;
int label = 1;
int result = 0;
for (int i = 0; i < str.length(); i++){
if (i == 0 && ((str.charAt(i) == '-') || str.charAt(i) == '+')){ // 第一位如果是负数,"+"或者"-"
if (str.charAt(i) == '-'){ // 若是"-",则改变边界条件(limit)和符号位(label)
limit = Integer.MIN_VALUE;
label = -1;
}
continue;
}else if (str.charAt(i) >= '0' && str.charAt(i) <= '9'){ // 如果是数字,继续分析
int num = str.charAt(i) - '0';
int temp = result * 10;
if (result >= (limit / 10) && temp >= (limit + num) ){ // 关键在这里,见文字分析
result = result * 10 - num;
}else { // 数值溢出, 返回0
return 0;
}
}else { // 如果是非法字符, 返回0
return 0;
}
}
return label > 0 ? -result: result;
}

京公网安备 11010502036488号