Implement the myAtoi(string s) function, which converts a string to a 32-bit signed integer (similar to C/C++'s atoi function).
The algorithm for myAtoi(string s) is as follows:
- Read in and ignore any leading whitespace.
- Check if the next character (if not already at the end of the string) is '-' or '+'. Read this character in if it is either. This determines if the final result is negative or positive respectively. Assume the result is positive if neither is present.
- Read in next the characters until the next non-digit charcter or the end of the input is reached. The rest of the string is ignored.
- Convert these digits into an integer (i.e. "123" -> 123, "0032" -> 32). If no digits were read, then the integer is 0. Change the sign as necessary (from step 2).
- If the integer is out of the 32-bit signed integer range [-231, 231 - 1], then clamp the integer so that it remains in the range. Specifically, integers less than -231 should be clamped to -231, and integers greater than 231 - 1 should be clamped to 231 - 1.
- Return the integer as the final result.
Note:
- Only the space character ' ' is considered a whitespace character.
- Do not ignore any characters other than the leading whitespace or the rest of the string after the digits.
class Solution {
public:
int64_t myAtoi(string s) {
int64_t ans = 0;
int start = -1;
bool neg = false;
map<int8_t, bool> operators;
for (int i = 0; i < s.length(); i++)
{
if (s[i] >= 48 && s[i] <= 57)
{
ans *= 10;
ans += (int64_t)((int)s[i] - 48);
if (ans > (int64_t)pow(2, 31))
{
ans = (int64_t)pow(2, 31);
break;
}
if (start == -1) start = i;
}
else
{
if (s[i] != 32 && s[i] != 43 && s[i] != 45) break;
if (i > 0 && (s[i-1] >= 48 && s[i-1] <= 57)) break;
if (s[i] == 43) operators[i] = true;
if (s[i] == 45) operators[i] = false;
if (operators.size() > 1) break;
}
if (start != -1 && operators.size() > 0 && \
abs(std::prev(operators.end())->first - start) > 1)
{
ans = 0;
break;
}
}
if (ans > 0 && operators.size() > 0)
{
if (abs(std::prev(operators.end())->first - start) == 1)
{
if (std::prev(operators.end())->second == false) ans *= -1;
}
}
return (ans == (int64_t)pow(2, 31) ? --ans : ans);
}
};
'Challenge' 카테고리의 다른 글
[Codility] Passing Cars (0) | 2021.09.27 |
---|---|
[LeetCode] Palindrome Number (0) | 2021.09.24 |
[LeetCode] Reverse Integer (0) | 2021.09.14 |
[LeetCode] ZigZag Conversion (0) | 2021.09.13 |
Check for pair with a given sum (0) | 2021.09.13 |