Skip to content

字符串相加

约 567 字大约 2 分钟

2025-02-28

415. 字符串相加

给定两个字符串形式的非负整数 num1num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 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
  • num1num2 都只包含数字 0-9
  • num1num2 都不包含任何前导零

模拟

class Solution {
    public String addStrings(String num1, String num2) {
        StringBuilder res = new StringBuilder(""); // 用于存储结果的字符串构建器
        int i = num1.length() - 1; // num1 的最后一个字符的索引
        int j = num2.length() - 1; // num2 的最后一个字符的索引
        int carry = 0; // 进位

        // 当 i 或 j 不小于 0 时,循环继续,这样可以处理不同长度的字符串
        while (i >= 0 || j >= 0) { // 这个 || 和下面两个条件搭配,妙。
            // 如果 i >= 0,取 num1 的当前位的值,否则取 0
            int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
            // 如果 j >= 0,取 num2 的当前位的值,否则取 0
            int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
            
            // 计算当前位的和,包括进位
            int tmp = n1 + n2 + carry;
            // 更新进位
            carry = tmp / 10;
            // 将当前位的结果添加到结果字符串构建器中
            res.append(tmp % 10);
            
            // 移动到 num1 的前一位
            i--;
            // 移动到 num2 的前一位
            j--;
        }

        // 如果最后还有进位,将其添加到结果中。重点。
        // 注意 carry 最大就是 1。两个一位数相加最大就是 9 + 9,而 9 + 9 = 18,进位是 1,从而两个一位数相加再加上进位最大就是 19.
        if (carry == 1) res.append(1);

        // 由于结果是从低位到高位添加的,最后需要反转字符串构建器并返回
        return res.reverse().toString();
    }
}
  • 时间复杂度:O(max(len1,len2))O\left(\max \left(l e n_1, l e n_2\right)\right) ,其中 len1=num1l e n_1=n u m_1.length, len n2=num2n_2=n u m_2.length 。竖式加法的次数取决于较大数的位数。
  • 空间复杂度:使用了 StringBuilder,故空间复杂度为 O(n)O(n)