Skip to content

415. 字符串相加

题目链接:https://leetcode.cn/problems/add-strings/

代码

ts
function addStrings(num1: string, num2: string): string {
    let p1 = num1.length - 1, p2 = num2.length - 1;
    const res = [];
    let carry = 0;

    while (p1 >= 0 || p2 >= 0 || carry > 0) {
        const n1 = p1 >= 0 ? Number(num1[p1]) : 0;
        const n2 = p2 >= 0 ? Number(num2[p2]) : 0;
        const sum = n1 + n2 + carry;
        carry = sum >= 10 ? 1 : 0;
        res.push(sum % 10);
        p1--;
        p2--;
    }
    return res.reverse().join('')
};

思路

模拟我们平时做加法的过程,从低位到高位逐位相加:

  1. p1p2 分别指向 num1num2 的末尾
  2. carry 记录进位
  3. 每次取当前位数字,如果某一方已经越界,就按 0 处理
  4. 计算当前位和 sum = n1 + n2 + carry
  5. sum % 10 加入结果数组,把新的进位更新为 carry
  6. 循环直到两个字符串都遍历完,并且没有进位
  7. 由于结果是从低位到高位加入的,最后需要反转再拼接成字符串

关键点

  • 不能直接把整个字符串转成整数,因此要逐位模拟加法

  • 越界位置按 0 处理,可以统一逻辑

  • 循环条件里要保留 carry > 0,避免最后一位进位丢失

  • 时间复杂度 O(max(m,n)),其中 mn 分别是两个字符串的长度

  • 空间复杂度 O(max(m,n)),用于存储结果数组