8. String to Integer (atoi)
-
Implement atoi which converts a string to an integer.
-
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.
-
Note:
Only the space character ’ ’ is considered as whitespace character.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. If the numerical value is out of the range of representable values, INT_MAX (231 − 1) or INT_MIN (−231) is returned. -
Example 1:
Input: “42”
Output: 42 -
Example 2:
Input: " -42"
Output: -42
Explanation: The first non-whitespace character is ‘-’, which is the minus sign.
Then take as many numerical digits as possible, which gets 42. -
Example 3:
Input: “4193 with words”
Output: 4193
Explanation: Conversion stops at digit ‘3’ as the next character is not a numerical digit. -
Example 4:
Input: “words and 987”
Output: 0
Explanation: The first non-whitespace character is ‘w’, which is not a numerical
digit or a +/- sign. Therefore no valid conversion could be performed.
代码 C++
class Solution {
public:
int myAtoi(string str) {
if(str.empty()) return 0;
int i = 0,sign = 1;
while(i+1 < str.size() && isspace(str[i])) ++i;
long res = 0;
if(str[i] == '-') //"+-"也是非法的,直接返回0"
{
if(isdigit(str[i+1]) == 1)
{
sign = -1;
i++;
}
else return 0;
}
if(str[i] == '+')
{
if(isdigit(str[i+1]) == 1) i++;
else return 0;
}
while(i < str.size())
{
if(isdigit(str[i])) res = 10 * res + str[i++] - '0';
else return res * sign;
if(res > INT_MAX) return sign == -1 ? INT_MIN : INT_MAX;
}
return res * sign;
}
};