题目描述

题目链接:43. 字符串相乘

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

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例1:

1
2
输入: num1 = "2", num2 = "3"
输出: "6"

示例2:

1
2
输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字0本身。

我的题解

方法一:模拟乘法

思路

模拟乘法计算过程,使用数组记录中间值。

代码

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
class Solution {
public String multiply(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)) {
return "0";
}
int n = num1.length(), m = num2.length();
int[] r = new int[n + m];
for (int i = n - 1; i >= 0; i--) {
for (int j = m - 1; j >= 0; j--) {
int index = m - j - 1 + (n - i - 1);
int a = num1.charAt(i) - '0';
int b = num2.charAt(j) - '0';
int sum = a * b + r[index];
r[index] = sum % 10;
int c = sum / 10;
r[index + 1] += c;
}
}
StringBuilder sb = new StringBuilder();
int index = r.length - 1;
while (r[index] == 0) {
index--;
}
for (int i = index; i >= 0; i--) {
sb.append(r[i]);
}
return sb.toString();
}
}

结果

执行用时:3 ms, 在所有 Java 提交中击败了67.02%的用户

内存消耗:39.8 MB, 在所有 Java 提交中击败了99.65%的用户