415. Add Strings - Detailed Explanation
Problem Statement
You are given two non-negative integers represented as strings, num1 and num2. Your task is to return the sum of num1 and num2 as a string. You must solve the problem without converting the inputs directly into integers (i.e. using arithmetic operations on the strings themselves).
Example Inputs & Outputs
-
Example 1:
- Input: num1 =
"11"
, num2 ="123"
- Output:
"134"
- Explanation:
The sum is computed as 11 + 123 = 134.
- Input: num1 =
-
Example 2:
- Input: num1 =
"456"
, num2 ="77"
- Output:
"533"
- Explanation:
The sum is computed as 456 + 77 = 533.
- Input: num1 =
-
Example 3:
- Input: num1 =
"0"
, num2 ="0"
- Output:
"0"
- Explanation:
The sum is 0 + 0 = 0.
- Input: num1 =
Constraints
- Both num1 and num2 contain only digits.
- Both num1 and num2 do not have any leading zeros, except for the number 0 itself.
- The lengths of num1 and num2 are at least 1.
Hints
-
Process from Right to Left:
Since addition is performed from the least significant digit (rightmost) to the most significant digit (leftmost), consider using two pointers starting at the end of both strings. -
Maintain a Carry:
Keep track of a carry value that may result from adding two digits. The carry will be added to the sum of the next pair of digits. -
Build the Result:
As you calculate each digit of the result, append it to a result container (or use a data structure that allows you to easily reverse the result later) because you’re processing the digits in reverse order. -
Edge Cases:
Handle cases where the two strings have different lengths, and remember to include the final carry (if non-zero) after processing all digits.
Approach 1: Digit-by-Digit Addition (Simulation)
Step-by-Step Walkthrough
-
Initialize Pointers and Variables:
- Set two pointers,
i
andj
, to point to the last characters of num1 and num2 respectively. - Initialize a variable
carry
to 0. - Prepare an empty list or string builder to accumulate result digits.
- Set two pointers,
-
Iterate Through Both Strings:
- While either pointer is valid or there is a non-zero carry:
- Extract the current digit from num1 if available; otherwise, treat it as 0.
- Extract the current digit from num2 if available; otherwise, treat it as 0.
- Calculate the sum:
digit1 + digit2 + carry
. - Update the current digit of the result as the remainder of the sum when divided by 10 (i.e.
sum % 10
). - Update
carry
as the quotient of the sum divided by 10 (i.e.sum // 10
). - Move the pointers one position to the left.
- While either pointer is valid or there is a non-zero carry:
-
Reverse and Return the Result:
- Since digits are collected from least significant to most significant, reverse the result and join it into a string.
- Return the resulting string.
Visual Example Using num1 = "456"
, num2 = "77"
-
Initialize:
i = 2 (pointing at'6'
), j = 1 (pointing at'7'
), carry = 0, result = []. -
Iteration 1:
- Digits:
'6'
(from num1) and'7'
(from num2) → 6 + 7 + 0 = 13. - Current Digit: 13 % 10 = 3, carry = 13 // 10 = 1.
- Result: ["3"].
- Move pointers: i = 1, j = 0.
- Digits:
-
Iteration 2:
- Digits:
'5'
(from num1) and'7'
(from num2) → 5 + 7 + 1 = 13. - Current Digit: 13 % 10 = 3, carry = 1.
- Result: ["3", "3"].
- Move pointers: i = 0, j = -1.
- Digits:
-
Iteration 3:
- Digits:
'4'
(from num1) and no digit from num2 (use 0) → 4 + 0 + 1 = 5. - Current Digit: 5 % 10 = 5, carry = 0.
- Result: ["3", "3", "5"].
- Move pointers: i = -1, j = -1.
- Digits:
-
Finalize:
Reverse the result → "5", "3", "3" → join to form"533"
.
Approach 2: Using a String Builder (Java-Style Simulation)
The idea remains the same as in Approach 1, but you can leverage a mutable string builder (or similar data structure) to efficiently append digits and then reverse the final string.
Code Examples
Python Code
Java Code
Complexity Analysis
-
Time Complexity:
The algorithm processes each digit once, so the time complexity is (O(\max(n, m))), where (n) and (m) are the lengths of num1 and num2 respectively. -
Space Complexity:
The space used is (O(\max(n, m))) for the result storage.
Common Mistakes & Edge Cases
Common Mistakes
-
Not Handling the Carry Properly:
Failing to add the carry to the next pair of digits can result in an incorrect sum. -
Off-by-One Errors:
Be cautious with the loop termination condition to ensure that all digits (and any final carry) are processed. -
Incorrect Conversion of Characters to Integers:
Remember to convert the character digits (e.g., usingchar - '0'
in Java orint()
in Python).
Edge Cases
-
One or Both Numbers are Zero:
Ensure that when one or both inputs are"0"
, the function returns"0"
. -
Different Lengths:
Handle cases where num1 and num2 have different lengths correctly by treating missing digits as 0.
Alternative Variations & Related Problems
Variations
-
Multiply Strings:
A similar problem where you multiply two numbers represented as strings without using built-in big integer libraries. -
Subtract Strings:
Implement subtraction for two non-negative integers represented as strings.
Related Problems for Further Practice
-
Reverse Integer:
Practice reversing digits of an integer, which often involves similar manipulation techniques. -
String to Integer (atoi):
Convert a string to an integer while handling various edge cases.
GET YOUR FREE
Coding Questions Catalog
