<span style="font-family:Times New Roman;font-size:18px;">
</span>
原题: String to Integer (atoi)
Implement atoi to convert a string to an integer.
解答:
C++版本
int atoi(const char *str) {
int sign = 1, base = 0, i = 0;
while (str[i] == ' ') { i++; }
if (str[i] == '-' )
{ sign = -1; i++}
else if (str[i] == '+' )
i++;
while (str[i] >= '0' && str[i] <= '9') {
if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
if (sign == 1) return INT_MAX;
else return INT_MIN;
}
base = 10 * base + (str[i++] - '0');
}
return base * sign;
}
Java版本
public int myAtoi(String str) {
int index = 0, sign = 1, total = 0;
//1. Empty string
if(str.length() == 0) return 0;
//2. Remove Spaces
while(str.charAt(index) == ' ' && index < str.length())
index ++;
//3. Handle signs
if(str.charAt(index) == '+' || str.charAt(index) == '-'){
sign = str.charAt(index) == '+' ? 1 : -1;
index ++;
}
//4. Convert number and avoid overflow
while(index < str.length()){
int digit = str.charAt(index) - '0';
if(digit < 0 || digit > 9) break;
//check if total will be overflow after 10 times and add digit
if(Integer.MAX_VALUE/10 < total || Integer.MAX_VALUE/10 == total && Integer.MAX_VALUE %10 < digit)
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
total = 10 * total + digit;
index ++;
}
return total * sign;
}
思路:
考虑4个问题
1、前导空格
2、正负号
3、溢出
4、非法输入
注意:
1、不合法的输入包括
“ *24” 、“- 333” 、“ -+22” “233t2”
但是本程序认为”433322323233322t”合法,因为会提前退出。
2、 if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7))
很重要,尤其是当base == INT_MAX / 10时,这个判断对于负数也是成立的,因为负数最小为-2147483648,当str[i] - '0' == 8时,也恰好是INT_MIN。