LeetCode 415. 字符串相加
题目描述
题目:
给定两个字符串形式的非负整数 num1 和 num2,计算它们的和并以字符串形式返回。不能使用任何内置大整数库,也不能直接将输入转换为整数。
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
提示:
1 <= num1.length, num2.length <= 10^4-
num1和num2都只包含数字0-9 -
num1和num2都不包含任何前导零,除了数字 0 本身
思路分析
解法一:双指针模拟(推荐)
核心思路:
模拟手工加法:两个指针分别从
num1和num2末尾向前扫描,逐位相加并处理进位。
- 循环条件:
p1 >= 0 || p2 >= 0 || carry > 0(任一条件为真则继续)- 每次取当前位的数字,若指针已越界则补
0- Java 用
StringBuilder尾部追加后反转,避免字符串拼接的 O(n²) 开销
复杂度分析:
- 时间复杂度:O(max(m, n)),其中 m、n 分别表示
num1和num2的长度。- 空间复杂度:O(1),不计返回字符串的空间。
class Solution {
public String addStrings(String num1, String num2) {
int p1 = num1.length() - 1, p2 = num2.length() - 1;
int carry = 0;
StringBuilder sb = new StringBuilder();
while (p1 >= 0 || p2 >= 0 || carry > 0) {
int sum = carry;
if (p1 >= 0) {
sum += num1.charAt(p1--) - '0';
}
if (p2 >= 0) {
sum += num2.charAt(p2--) - '0';
}
// 尾部追加,最后反转
sb.append(sum % 10);
carry = sum / 10;
}
return sb.reverse().toString();
}
}
func addStrings(num1 string, num2 string) string {
p1, p2 := len(num1)-1, len(num2)-1
carry := 0
res := ""
for p1 >= 0 || p2 >= 0 || carry > 0 {
sum := carry
if p1 >= 0 {
sum += int(num1[p1] - '0')
p1--
}
if p2 >= 0 {
sum += int(num2[p2] - '0')
p2--
}
res = strconv.Itoa(sum%10) + res
carry = sum / 10
}
return res
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 2. 两数相加 | 中等 | 链表加法、进位处理 |
| 43. 字符串相乘 | 中等 | 大数乘法、逐位模拟 |
| 67. 二进制求和 | 简单 | 字符串加法、进位处理 |
| 989. 数组形式的整数加法 | 简单 | 数组加法、进位处理 |
| 369. 给单链表加一 | 中等 | 链表加法、进位处理 |
| 66. 加一 | 简单 | 数组加法、进位处理 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
