Wednesday, January 7, 2015

[LeetCode]String to Integer(atoi)

主要麻烦的地方在于注意各种corner case,按照题目要求来就好。主要讲一下,判断overflow, 之前我用的是很蠢的判断溢出的方法,以正数为例,之前是Integer.MAX_VALUE减去十次原来的数,在减去新的一位看是不是大于0。刷第三次的时候觉得这个方法太过于愚蠢了,稍微想了下,只需要Integer.MAX_VALUE减去新的那一位再除以10,看是不是大于原来的数就可以了。




代码如下:
public class Solution {
public int atoi(String str) {
if(str == null)
return 0;
int len = str.length();
if (len == 0)
return 0;
int start = 0;
boolean isNeg = false;
while (start < len && str.charAt(start) == ' ')
start++;
if (start == len)
return 0;
if (str.charAt(start) == '+')
start++;
else if (str.charAt(start) == '-') {
isNeg = true;
start++;
}
if (start == len)
return 0;
int res = 0;
for (int i = start; i < len; i++) {
if (!isNum(str.charAt(i)))
return res;
int add = str.charAt(i) - '0';
if (isOverflow(isNeg, res, add))
return isNeg? Integer.MIN_VALUE: Integer.MAX_VALUE;
else
res = isNeg? 10 * res - add: 10 * res + add;
}
return res;
}
private boolean isOverflow(boolean isNeg, int base, int add) {
if (!isNeg) {
int upperBound = (Integer.MAX_VALUE - add) / 10;
return upperBound < base;
} else {
int lowerBound = (Integer.MIN_VALUE + add) / 10;
return lowerBound > base;
}
}
private boolean isNum(char c) {
int digit = c - '0';
return digit <= 9 && digit >= 0;
}
}
view raw atoi.java hosted with ❤ by GitHub

No comments:

Post a Comment