在问 · 算法题解

415. 字符串相加

题目描述

输入两个字符串 num1 和 num2,各自表示一个非负整数的十进制写法。

求这两个数的和,结果同样用十进制字符串返回。

不允许借助任何大数类库,也不允许先把整个字符串转换成整数类型再相加。需要按位模拟加法并处理进位。

示例 1
输入:num1 = "11", num2 = "123"
输出:"134"

解释:11 + 123 = 134。

示例 2
输入:num1 = "456", num2 = "77"
输出:"533"

解释:456 + 77 = 533,个位和十位都产生进位。

示例 3
输入:num1 = "0", num2 = "0"
输出:"0"

解释:0 + 0 = 0。

数据范围

  • 1 <= num1.length, num2.length <= 10^4
  • num1 和 num2 中只有字符 0 到 9。
  • 两个字符串都没有前导零。

解题思路

模拟竖式加法:两个指针 i、j 从末位往前走,每一位取 a + b + carry,写下个位、进位留给下一位。某个数先走完就当作 0。只要还有数位或进位就继续,最后把结果反转。

为什么正确

处理完低 k 位后,res 倒过来是两数低 k 位之和的低 k 位,carry 是向第 k+1 位的进位。

复杂度分析

时间 O(max(m, n));空间 O(max(m, n))(输出)。

易错点

循环条件忘记 carry 会丢掉最高位的进位,把 "9" + "1" 算成 "0"。用 res = d + res 从头部拼接在某些语言里是 O(n²)。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        i, j, carry = len(num1) - 1, len(num2) - 1, 0
        res = []
        while i >= 0 or j >= 0 or carry:
            a = int(num1[i]) if i >= 0 else 0
            b = int(num2[j]) if j >= 0 else 0
            carry, d = divmod(a + b + carry, 10)
            res.append(str(d))
            i, j = i - 1, j - 1
        return ''.join(reversed(res))

载入编辑器,自己跑一遍 →

字符串 专题的其他题目

查看 字符串 全部题目 →