文章目录
- 题目描述
- 解题方法
- 相乘累加
- java代码
- 复杂度分析
题目描述
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger
库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
提示:
1 <= num1.length, num2.length <= 200
num1
和num2
只能由数字组成。num1
和num2
都不包含任何前导零,除了数字0
本身。
解题方法
相乘累加
其实就和我们的乘法运算一样,我们可以把每一位上的数字相乘后累加,这样我们就得到了各个位上的数字。计算最终结果时,各位数字加上低位数字进位,然后除10取余。
下面我来举个例子。
1 2 3
* 4 5 6
-----------------------
6 12 18 计算每位上的数字乘积
+ 5 10 15
+ 4 8 12
-------------------------------------------
4 13 28 27 18 每位上的数字相乘后累加
--------------------------------------------
5 6 0 8 8 各位数字加上低位数字进位,然后除10取余
java代码
public String multiply(String num1, String num2) {
String n1 = new StringBuilder(num1).reverse().toString();
String n2 = new StringBuilder(num2).reverse().toString();
char zero = '0';
int[] nums = new int[n1.length() + n2.length()];
for (int i = 0; i < n1.length(); i++) {
for (int j = 0; j < n2.length(); j++) {
// 各位数字的乘积累加
nums[i + j] += (n1.charAt(i) - zero) * (n2.charAt(j) - zero);
}
}
for (int i = 0; i < nums.length; i++) {
// 低位数字除10取余
int digit = nums[i] % 10;
// 低位数字除10向高位进位
int carry = nums[i] / 10;
if (i < nums.length - 1) {
nums[i + 1] += carry;
}
nums[i] = digit;
}
StringBuilder result = new StringBuilder();
boolean flag = true;
for (int i = nums.length - 1; i >= 0; i--) {
// 去掉高位0
if (i != 0 && flag && nums[i] == 0) {
continue;
}
flag = false;
result.append(nums[i]);
}
return result.toString();
}
复杂度分析
时间复杂度:
O
(
m
n
)
O(mn)
O(mn),
m
m
m 和
n
n
n是 num1
和 num2
的长度,计算数字乘积时会进行num1
和 num2
的两次循环遍历。
空间复杂度:
O
(
m
+
n
)
O(m + n)
O(m+n),需要
m
m
m +
n
n
n的空间存储计算结果。
- 个人公众号
- 个人小游戏