字符串相加
约 567 字大约 2 分钟
2025-02-28
415. 字符串相加
给定两个字符串形式的非负整数 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
都不包含任何前导零
模拟
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)) ,其中 len1=num1.length, len n2=num2.length 。竖式加法的次数取决于较大数的位数。
- 空间复杂度:使用了 StringBuilder,故空间复杂度为 O(n) 。