题目
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
提示:
1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
思路: 进位
这道题目是字符串模拟题,需要我们模拟手算加法的过程,按位相加并进位,直到所有的位数都计算完毕。具体来说,我们可以从低位开始依次相加,将每一位上的数字相加,然后再加上进位的数字,得到当前位的和。当前位的和对 10 取余,得到当前位上的数字,将当前位上的数字添加到结果字符串的末尾;当前位的和如果大于等于 10,说明需要进位,将进位的数字保存到下一次计算即可。需要注意的是,最后计算完毕后,可能会存在进位的情况,此时需要将进位的数字添加到结果字符串的末尾。
function addStrings(num1: string, num2: string): string {
let carry = 0;
let result = '';
let i = num1.length - 1;
let j = num2.length - 1;
while(i >= 0 || j >= 0 || carry) {
const a = i >= 0 ? parseInt(num1[i]) : 0;
const b = j >= 0 ? parseInt(num2[j]) : 0;
let sum = a + b + carry;
carry = Math.floor(sum / 10);
sum = sum % 10;
result = `${sum}${result}`;
i--;
j--;
}
return result;
};
总结
- 时间复杂度 这道题目需要对两个字符串中的所有字符进行遍历,因此时间复杂度为 O(max(m, n)),其中 m 和 n 分别是两个字符串的长度。
- 空间复杂度为 O(max(m, n)),即存储计算结果的字符串的长度。
- 这道题目是字符串模拟题,需要我们模拟手算加法的过程,按位相加并进位,直到所有的位数都计算完毕。在实现过程中需要注意边界条件的处理,以及对进位的处理。