LeetCode之8:String to Integer (atoi)
问题描述:
将字符串转换为合法的数字。题目地址
问题的陷阱与难点:
- 思路很好想,但是鲁棒性,鲁棒性,鲁棒性!!!
缺陷代码(99.50%)
public int myAtoi(String str) {
if (str == null || str.length() ==0) {
return 0;
}
int index = 0;
int signalIndex = -1;
boolean firstNonEmpty = true;
while (index < str.length() && (str.charAt(index) < '0' || str.charAt(index) > '9')) {
char current = str.charAt(index);
//解决"words and 987",首个非空字符为非数字
if (current != ' ' && current != '+' && current != '-' && firstNonEmpty) {
firstNonEmpty = false;
return 0;
}
if (current == '+' || current == '-') {
signalIndex = index;
}
index ++;
}
if (index >= str.length()) {
return 0;
}
long negative = 1L;
//解决"+ 99",符号位与数字有间隔
if (signalIndex >=0 && index - signalIndex > 1) {
return 0;
}
if (index > 0) {
char signal = str.charAt(index - 1);
if (signal == '-') {
negative = -1L;
}
//解决"++999",连续多个符号位
if (index > 1 && (signal == '+' || signal == '-')) {
char temp = str.charAt(index - 2);
if (temp == '+' || temp == '-') {
return 0;
}
}
}
long result = 0L;
while (index < str.length() && str.charAt(index) >= '0' && str.charAt(index) <= '9') {
result = result * 10L + (long)(str.charAt(index) - '0');
//解决越界问题,使用long存储数字也可能是不足够的。
if (result >= Integer.MAX_VALUE && negative == 1) {
return Integer.MAX_VALUE;
} else if (result <= Integer.MIN_VALUE && negative == -1) {
return Integer.MIN_VALUE;
}
index ++;
}
result = result * negative;
if (result >= Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
} else if (result <= Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
} else {
return (int) result;
}
}
思路
这道题主要考察的是鲁棒性。 思路是定位到符号位以及第一个数字位。下面只强调一下鲁棒性可能被遗忘的点。
- 解决"+ 99",符号位与数字有间隔
- 解决"++999",连续多个符号位
- 解决越界问题,使用long存储中间的计算结果也可能是不足够的。