LeetCode热题(JS版)- 415. 字符串相加

200 阅读1分钟

题目

给定两个字符串形式的非负整数 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;
};

image.png

总结

  • 时间复杂度 这道题目需要对两个字符串中的所有字符进行遍历,因此时间复杂度为 O(max(m, n)),其中 m 和 n 分别是两个字符串的长度。
  • 空间复杂度为 O(max(m, n)),即存储计算结果的字符串的长度。
  • 这道题目是字符串模拟题,需要我们模拟手算加法的过程,按位相加并进位,直到所有的位数都计算完毕。在实现过程中需要注意边界条件的处理,以及对进位的处理。