因为在相加或相乘的时候,可能会出现值溢出,所以直接相加或相乘肯定是不行的, 需要另想办法。

这两道题都是模拟摆竖式进行加法与乘法, 但是有一些细节点在写的时候需要注意。

字符串相加

https://leetcode.cn/problems/add-strings

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

解题关键点:

  • 模拟竖式相加,并且使用双指针,指针的移动方向从尾部向头部p1--
  • num1和num2的长度可能不相等,所以会出现p1或p2小于0的情况,需要单独处理
  • 有可能头部元素相加的时候大于10, 所以需要在循环外单独判断进位数
  • 在获取每一位的int数值时, 将其与’0’这个char相减, 省去了强转, 更加简洁
  • 最后得到的结果是反的, 需要反转一下

下面是完整代码:

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
 public String add(String num1, String num2) {
int p1 = num1.length() - 1;
int p2 = num2.length() - 1;
// 进位数
int add = 0;
StringBuilder result = new StringBuilder();
while(p1 >= 0 || p2 >= 0){
// 每一位先赋默认值0,当p>=0时,表明此时这个字符串还没遍历结束,则取当前位上的字符
int value1 = 0;
if (p1 >= 0){
// 直接与'0'相减得到int值
value1 = num1.charAt(p1) - '0';
}
int value2 = 0;
if (p2 >= 0){
value2 = num2.charAt(p2) - '0';
}
result.append((value1 + value2 + add) % 10);
add = (value1 + value2 + add) / 10;
p1--;
p2--;
}
// 最后一步相加的时候可能大于10,需要进位
if (add != 0){
result.append(add);
}
return result.reverse().toString();
}

字符串相乘

https://leetcode.cn/problems/multiply-strings/

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

解题关键点:

举例 num1=”123”, num2=”45”, 相乘的时候可以拆分如下:

1
result = 123 * 5 + 123 * 40

在计算每一项时, 比如第二项123 * 40时,其末尾必然为0, 且0的个数和其所处的位置有关,所以可以提前补0, 通过观察发现, 补0的个数 = (字符串长度-1) - 当前下标

通过补0之后, 我们就可以专心计算 123 * 4了, 也是利用摆竖式进行相乘的思路进行相加。

当我每得到一项的值时, 利用之前的字符串相加函数, 就可以将各项的结果相加,最终获取结果值。

下面是完整代码:

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
public String multiply(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)){
return "0";
}
int l1 = num1.length() - 1;
int l2 = num2.length() - 1;

String re = "0";
for (int i = l2; i >= 0; i--){
// 这个值记录每一项相乘的结果
StringBuilder current = new StringBuilder();
// 补0
int cycle = l2 - i;
for (int j = 1; j <= cycle; j++){
current.append("0");
}

int value2 = num2.charAt(i) - '0';
int add = 0;
// 每一项的竖式相乘
for (int j = l1; j >= 0; j--){
int value1 = num1.charAt(j) - '0';
current.append((value1 * value2 + add) % 10);
add = (value1 * value2 + add) / 10;
}
// 和加法一样,最后一步的相乘可能会超过10,需要进位
if (add != 0){
current.append(add);
}
// 每一项的结果相加
re = add(current.reverse().toString(), re);
}
return re;
}