0%

字符串相加


题目描述

给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和。

提示:

  • num1 和 num2 的长度都小于 5100
  • num1 和 num2 都只包含数字 0-9
  • num1 和 num2 都不包含任何前导零
  • 你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式

题解

我们只需要对两个大整数模拟「竖式加法」的过程。竖式加法就是我们平常学习生活中常用地对两个整数相加的方法,回想一下我们在纸上对两个整数相加的操作,是不是如下图将相同数位对齐,从低到高逐位相加,如果当前位和超过 10,则向高位进一位?因此我们只要将这个过程用代码写出来即可。我们使用两个变量分别指向两个数的末尾,进行加法操作,同时使用 carry 保存进位,若两个字符串不一样长,我们两个字符串遍历完成后,要继续遍历未计算的字符串,最后,别忘了,如果进位是 1 的话,要把进位加到最终的结果中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public String addStrings(String num1, String num2) {
int index1 = num1.length() - 1;
int index2 = num2.length() - 1;
StringBuilder res = new StringBuilder();
int carry = 0;
while (index1 >=0 && index2 >= 0) {
int n1 = num1.charAt(index1) - '0';
int n2 = num2.charAt(index2) - '0';
carry = addNum(n1, n2, carry, res);
index1--;
index2--;
}

while (index1 >= 0) {
int n1 = num1.charAt(index1) - '0';
carry = addNum(n1, 0, carry, res);
index1--;
}

while (index2 >= 0) {
int n2 = num2.charAt(index2) - '0';
carry = addNum(0, n2, carry, res);
index2--;
}

if (carry > 0) {
res.append(carry);
}
return res.reverse().toString();
}

public int addNum(int n1, int n2, int carry, StringBuilder res) {
int sum = n1 + n2 + carry;
res.append(sum % 10);
return sum / 10;
}

这里,我们其实不需要这么长的代码,判断最后哪个字符串更长,针对短的字符串,我们进行补 0 操作即可。也不需要判断是否有进位,最后还要记得加上去。我们可以简化代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public String addStrings(String num1, String num2) {
int index1 = num1.length() - 1;
int index2 = num2.length() - 1;
int carry = 0;
StringBuilder res = new StringBuilder();
while (index1 >= 0 || index2 >= 0 || carry != 0) {
int x = index1 >= 0 ? num1.charAt(index1) - '0' : 0;
int y = index2 >= 0 ? num2.charAt(index2) - '0' : 0;
int sum = x + y + carry;
res.append(sum % 10);
carry = sum / 10;
index1--;
index2--;
}
return res.reverse().toString();
}

复杂度分析

  • 时间复杂度:Ο(max(m, n)),其中 m 和 n 分别是两个字符串的长度。竖式加法的次数取决于较大数的位数。
  • 空间复杂度:O(n)。除答案外我们只需要常数空间存放若干的变量。但是解法中使用到了 StringBuilder,空间复杂度为 O(n)。

来源

字符串相加 | 力扣(LeetCode)
字符串相加 | 题解(LeetCode)


分享精彩,留下足迹

欢迎关注我的其它发布渠道