Question
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.
The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.
If no valid conversion could be performed, a zero value is returned. If the correct value is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.
Stats
Frequency | 5 |
Diffficulty | 2 |
Adjusted Difficulty | 2 |
Time to use | ---------- |
Ratings/Color = 1(white) 2(lime) 3(yellow) 4/5(red)
Analysis
This question is not difficult, but hard to get it right. Remember to handle all cases listed below:
- null or empty string
- white spaces
- +/- sign
- calculate real value
- return int.min or int.max
Solution
Use one loop to read through, and in the end do some checking. There is a very good explanation from online.
This is a standard string question, and try think of some special test cases.
My code
public class Solution {
public int atoi(String str) {
if (str == null || str.length() == 0) {
return 0;
}
int p = 0;
int len = str.length();
// omit as many space as possible
while (p < len) {
if (str.charAt(p) != ' ') {
break;
}
p++;
}
int sign = 1;
// check if there is a +/- sign at position p
// if there is, store its value and advance p
if (p == len) {
return 0;
} else if (str.charAt(p) == '+') {
p++;
} else if (str.charAt(p) == '-') {
sign = -1;
p++;
}
// check if position p have valid number
if (p == len) {
return 0;
} else if (str.charAt(p) < '0' || str.charAt(p) > '9') {
return 0;
}
// now position p is the start of numerical part.
int q = p;
while (q < len && str.charAt(q) >= '0' && str.charAt(q) <= '9') {
q++;
}
String numPart = str.substring(p, q);
// first, check if numPart is too long
if (numPart.length() > 15) {
if (sign == -1) {
return Integer.MIN_VALUE;
} else {
return Integer.MAX_VALUE;
}
}
// second, convert to numerical format and check value against Integer.MIN and MAX
long num = sign * Long.parseLong(numPart);
if (num > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
} else if (num < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
} else {
return (int) num;
}
}
}