Parsing numeric arguments - Time & Space Complexity
When parsing numbers from strings, it is important to know how the time needed grows as the input gets longer.
We want to find out how the work changes when the number has more digits.
Analyze the time complexity of the following code snippet.
int parseNumber(const char *str) {
int result = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] < '0' || str[i] > '9') break;
result = result * 10 + (str[i] - '0');
}
return result;
}
This code reads a string character by character and converts the digits into an integer number.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that reads each character in the string.
- How many times: Once for each character until a non-digit or end of string is found.
As the number of digits in the string grows, the loop runs longer, doing more work.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 loop steps |
| 100 | About 100 loop steps |
| 1000 | About 1000 loop steps |
Pattern observation: The work grows directly with the number of digits; double the digits means double the steps.
Time Complexity: O(n)
This means the time to parse grows in a straight line with the length of the input string.
[X] Wrong: "Parsing a number always takes constant time because numbers are small."
[OK] Correct: The time depends on how many digits the number has, not the value itself. Longer numbers take more steps.
Understanding how parsing time grows helps you write efficient input handling and shows you can think about performance clearly.
"What if we changed the code to parse hexadecimal numbers instead of decimal? How would the time complexity change?"
Practice
atoi function do in C when parsing numeric arguments?Solution
Step 1: Understand
atoifunction purposeatoiconverts a string to an integer but does not check for errors or invalid input.Step 2: Compare with other parsing functions
Unlikestrtol,atoidoes not provide error detection or pointer to next character.Final Answer:
Converts a string to an integer without error checking -> Option AQuick Check:
atoi= simple integer conversion [OK]
- Thinking atoi checks for invalid input
- Confusing atoi with strtol
- Assuming atoi returns pointer to next char
"1234" to an integer using strtol in C?Solution
Step 1: Check
strtolreturn typestrtolreturns along, so the variable must belong.Step 2: Verify argument order
Arguments are: string, pointer to char* for end, and base (10 for decimal). Sostrtol("1234", NULL, 10)is correct.Final Answer:
long num = strtol("1234", NULL, 10); -> Option BQuick Check:
strtolreturns long, args: string, endptr, base [OK]
- Using int instead of long for strtol result
- Mixing argument order in strtol
- Using atoi syntax with strtol
#include
#include
int main() {
char *str = "42abc";
char *endptr;
long val = strtol(str, &endptr, 10);
printf("%ld %s\n", val, endptr);
return 0;
}Solution
Step 1: Understand
strtolparsing behaviorstrtolconverts initial numeric part "42" to long and setsendptrto point after parsed number, which is "abc".Step 2: Analyze printf output
It prints the number 42 and then the string starting atendptr, which is "abc".Final Answer:
42 abc -> Option DQuick Check:
Parsed number + leftover string = 42 abc [OK]
- Assuming strtol parses entire string
- Ignoring endptr usage
- Expecting error on non-digit suffix
#include
int main(int argc, char *argv[]) {
int num = atoi(argv[1]);
if (num == 0) {
printf("Invalid number\n");
}
return 0;
}Solution
Step 1: Check argument count before access
The code usesargv[1]without verifyingargc > 1, risking out-of-bounds access.Step 2: Understand atoi zero ambiguity
While atoi returns 0 for invalid input and valid zero, the bigger issue is missing argument check causing runtime error.Final Answer:
Missing check if argc > 1 before accessing argv[1] -> Option AQuick Check:
Always check argc before argv access [OK]
- Ignoring argc check leads to crashes
- Confusing atoi zero return meaning
- Assuming atoi handles errors
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc <= 1) {
printf("No input provided\n");
return 1;
}
char *endptr;
long val = strtol(argv[1], &endptr, 10);
if (*endptr != '\0' || val <= 0) {
printf("Invalid positive integer\n");
return 1;
}
printf("Parsed value: %ld\n", val);
return 0;
}Solution
Step 1: Check argument count
The code checks ifargc <= 1to ensure input is provided.Step 2: Use
It verifiesstrtolwithendptrto detect invalid characters and check if value is positive*endptr == '\0'to confirm full string parsed andval > 0to ensure positive integer.Final Answer:
Correctly parses positive integers and rejects invalid or zero input -> Option CQuick Check:
strtol + endptr + value check = safe parsing [OK]
- Using atoi which can't detect invalid input
- Not checking endptr for leftover chars
- Ignoring zero or negative values
Ready to prove it?
Pass the test and this pattern moves unknown
