Converting Strings to Integers: A Comprehensive Guide
Written on
Chapter 1: Understanding the Problem
In this section, we delve into the algorithmic challenge of converting a string into a 32-bit signed integer, akin to the C/C++ atoi function.
The task requires implementing the myAtoi(string s) function. Here’s how the algorithm is structured:
- Leading Whitespace: Begin by disregarding any leading whitespace characters.
- Sign Determination: Check the next character; if it’s either '-' or '+', note this for the final integer’s sign. If neither character is found, default to a positive integer.
- Reading Digits: Continue reading characters until a non-digit character or the end of the string is encountered. Ignore everything else.
- Conversion: Convert the obtained digits into an integer (for example, "123" becomes 123, while "0032" translates to 32). If no digits are present, return 0.
- Clamping the Result: If the resulting integer exceeds the bounds of a 32-bit signed integer, clamp it to the nearest limit (less than -2^31 becomes -2^31, and more than 2^31 - 1 becomes 2^31 - 1).
- Final Output: Return the resulting integer.
Note: Only the space character ' ' is recognized as whitespace. Any other characters outside leading whitespace or trailing characters post-digit reading are disregarded.
Example Scenarios:
- Input: "42"
- Output: 42
- Input: " -42"
- Output: -42
- Input: "4193 with words"
- Output: 4193
Chapter 2: Algorithmic Analysis
The objective is to construct a function that translates a provided string into a signed 32-bit integer.
To achieve this, we can navigate through the string character by character. The construction of the integer halts when a non-digit character is encountered or when the number becomes too large for a 32-bit signed integer. In such cases, we must clamp the result to fit within the specified range.
We will incrementally build the integer. As we progress through the string, for each digit character, we shift the previous digits left by multiplying the integer by 10, and then we add the current digit to the unit place.
To clarify this process, let’s explore an example:
Critical Points to Consider:
- Edge Cases: Carefully review the problem statement and address various character possibilities.
- Interview Strategies: If posed with a question of this nature during an interview, ensure clear communication with your interviewer to cover all aspects.
Rule Set:
- Whitespace: Discard initial whitespaces; stop reading further if whitespace appears after the leading segment.
- Example: ' 1234' becomes 1234.
- Digits: Ignore leading zeros and read all digit characters until a non-digit is encountered.
- Example: '00123' becomes 123.
- Sign: Only one sign (+ or -) is allowed at the start. Further occurrences are treated as non-digit characters.
- Example: '-12' results in -12.
- Other Characters: On encountering any other character, stop the integer construction.
- Example: '-23a45' results in -23.
Clamping for 32-bit Integer Range:
If the integer surpasses 2^31 - 1, it should be limited to this value. If it falls below -2^31, it should be adjusted to -2^31.
Chapter 3: Implementation in Python, C++, and Java
Let's look at the implementation in various programming languages:
Python Solution:
class Solution:
def myAtoi(self, input: str) -> int:
sign = 1
result = 0
index = 0
n = len(input)
INT_MAX = pow(2, 31) - 1
INT_MIN = -pow(2, 31)
# Skip spaces
while index < n and input[index] == ' ':
index += 1
# Determine sign
if index < n and input[index] == '+':
sign = 1
index += 1
elif index < n and input[index] == '-':
sign = -1
index += 1
# Read digits
while index < n and input[index].isdigit():
digit = int(input[index])
if (result > INT_MAX // 10 or
(result == INT_MAX // 10 and digit > INT_MAX % 10)):
return INT_MAX if sign == 1 else INT_MIN
result = 10 * result + digit
index += 1
return sign * result
C++ Solution:
class Solution {
public:
int myAtoi(string input) {
int sign = 1;
int result = 0;
int index = 0;
int n = input.size();
while (index < n && input[index] == ' ') {
index++;}
if (index < n && input[index] == '+') {
sign = 1;
index++;
} else if (index < n && input[index] == '-') {
sign = -1;
index++;
}
while (index < n && isdigit(input[index])) {
int digit = input[index] - '0';
if ((result > INT_MAX / 10) ||
(result == INT_MAX / 10 && digit > INT_MAX % 10)) {
return sign == 1 ? INT_MAX : INT_MIN;
}
result = 10 * result + digit;
index++;
}
return sign * result;
}
};
Java Solution:
class Solution {
public int myAtoi(String input) {
int sign = 1;
int result = 0;
int index = 0;
int n = input.length();
while (index < n && input.charAt(index) == ' ') {
index++;}
if (index < n && input.charAt(index) == '+') {
sign = 1;
index++;
} else if (index < n && input.charAt(index) == '-') {
sign = -1;
index++;
}
while (index < n && Character.isDigit(input.charAt(index))) {
int digit = input.charAt(index) - '0';
if ((result > Integer.MAX_VALUE / 10) ||
(result == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10)) {
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
result = 10 * result + digit;
index++;
}
return sign * result;
}
}
Stay tuned for more engaging interview challenges and insights from my experiences as a senior software engineer at MANNG.