String to Integer atoi in DSA Javascript - Time & Space Complexity
We want to understand how the time needed to convert a string to an integer grows as the string gets longer.
How does the number of steps change when the input string size increases?
Analyze the time complexity of the following code snippet.
function myAtoi(s) {
let i = 0, sign = 1, result = 0;
while (s[i] === ' ') i++;
if (s[i] === '+' || s[i] === '-') {
sign = s[i] === '-' ? -1 : 1;
i++;
}
while (i < s.length && s[i] >= '0' && s[i] <= '9') {
result = result * 10 + (s.charCodeAt(i) - 48);
i++;
}
return sign * result;
}
This code converts a string to an integer by skipping spaces, checking the sign, and reading digits until a non-digit is found.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Two while loops that scan characters in the string.
- How many times: Each loop runs at most once over parts of the string, together scanning each character at most once.
As the string length grows, the code checks each character once or twice in sequence.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 character checks |
| 100 | About 100 character checks |
| 1000 | About 1000 character checks |
Pattern observation: The number of steps grows roughly in direct proportion to the string length.
Time Complexity: O(n)
This means the time to convert the string grows linearly with the string length.
[X] Wrong: "The function checks every character multiple times, so it must be slower than linear."
[OK] Correct: Each character is checked at most once or twice in sequence, so the total work still grows linearly, not more.
Understanding this linear time complexity helps you explain how your code handles input efficiently, a key skill in interviews.
"What if the input string contains many non-digit characters after digits? How would the time complexity change?"
Practice
atoi function in programming?Solution
Step 1: Understand the function name
atoistands for ASCII to integer, meaning it converts strings to integers.Step 2: Identify the function's purpose
It takes a string input and returns its integer value if possible.Final Answer:
Convert a string representing a number into an integer -> Option DQuick Check:
atoi = string to integer conversion [OK]
- Confusing atoi with integer to string conversion
- Thinking atoi sorts strings
- Assuming atoi validates string digits only
"123" to an integer using a method similar to atoi?Solution
Step 1: Identify the correct conversion method
parseIntconverts a string to an integer in JavaScript, similar toatoi.Step 2: Check each option
const num = parseInt("123"); usesparseIntcorrectly. const num = "123".toString(); converts string to string, no change. const num = Number.toString("123"); is invalid syntax. const num = "123" + 0; concatenates string and number, resulting in a string.Final Answer:
const num = parseInt("123"); -> Option BQuick Check:
parseInt("123") = 123 [OK]
- Using toString() which returns a string
- Trying Number.toString() incorrectly
- Adding 0 to string results in string concatenation
function myAtoi(str) {
let i = 0, sign = 1, result = 0;
while (str[i] === ' ') i++;
if (str[i] === '-' || str[i] === '+') {
sign = str[i] === '-' ? -1 : 1;
i++;
}
while (i < str.length && str[i] >= '0' && str[i] <= '9') {
result = result * 10 + (str[i].charCodeAt(0) - '0'.charCodeAt(0));
i++;
}
return sign * result;
}
console.log(myAtoi(" -42abc"));Solution
Step 1: Skip leading spaces and check sign
The function skips spaces, finds '-', sets sign to -1, moves index forward.Step 2: Convert digits until non-digit
Reads '4' and '2', converts to number 42, stops at 'a'.Step 3: Apply sign and return
Returns -1 * 42 = -42.Final Answer:
-42 -> Option CQuick Check:
myAtoi(" -42abc") = -42 [OK]
- Not skipping spaces before sign
- Ignoring sign and returning positive number
- Parsing non-digit characters
myAtoi function implementation:function myAtoi(str) {
let i = 0, sign = 1, result = 0;
while (str[i] === ' ') i++;
if (str[i] === '-' || str[i] === '+') {
sign = str[i] === '-' ? -1 : 1;
i++;
}
while (i < str.length && str[i] >= '0' && str[i] <= '9') {
result = result * 10 + (str[i] - '0');
i++;
}
return sign * result;
}Solution
Step 1: Analyze digit conversion
Expressionstr[i] - '0'tries to subtract strings, which results in NaN in JavaScript.Step 2: Correct approach
Usestr[i].charCodeAt(0) - '0'.charCodeAt(0)to get numeric value of digit character.Final Answer:
Subtracting characters directly without charCodeAt causes NaN -> Option AQuick Check:
String subtraction needs charCodeAt() [OK]
- Subtracting characters directly causing NaN
- Not handling empty or invalid input
- Ignoring sign application
myAtoi that converts a string to a 32-bit signed integer. Which approach correctly handles overflow and returns the clamped value if the number is out of range?function myAtoi(str) {
let i = 0, sign = 1, result = 0;
const INT_MAX = 2147483647;
const INT_MIN = -2147483648;
while (str[i] === ' ') i++;
if (str[i] === '-' || str[i] === '+') {
sign = str[i] === '-' ? -1 : 1;
i++;
}
while (i < str.length && str[i] >= '0' && str[i] <= '9') {
let digit = str[i].charCodeAt(0) - '0'.charCodeAt(0);
if (result > Math.floor(INT_MAX / 10) || (result === Math.floor(INT_MAX / 10) && digit > INT_MAX % 10)) {
return sign === 1 ? INT_MAX : INT_MIN;
}
result = result * 10 + digit;
i++;
}
return sign * result;
}Solution
Step 1: Check overflow condition
The code checks if adding the next digit causes overflow by comparing with INT_MAX/10 and last digit.Step 2: Return clamped value
If overflow detected, returns INT_MAX or INT_MIN depending on sign, correctly clamping the value.Step 3: Otherwise accumulate result
Accumulates digits safely within 32-bit integer range.Final Answer:
Correctly clamps overflow and returns 32-bit integer limits -> Option AQuick Check:
Overflow check and clamp = correct behavior [OK]
- Not checking overflow before multiplication
- Returning wrong values on overflow
- Ignoring sign when clamping
Ready to prove it?
Pass the test and this pattern moves unknown
