题目:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
- num1 和 num2 的长度小于110。
- num1 和 num2 只包含数字 0-9。
- num1 和 num2 均不以零开头,除非是数字 0 本身。
- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解析:
从题目的说明当中,我们也能够看出,这不是一道简单的利用编程语言中的四则运算就能够完成的题目,因为数字位数很长,我们只能一位一位的处理。本题的解题思路也非常直接,就是利用乘法的规则来进行计算,只是我们在写代码的过程中需要注意一些细节,这样就能够优化时间复杂度。比如:
- 提前将字符串先转为字符数组,然后转为整数数组,以便后面计算使用,避免重复计算增加时间复杂度
- 在计算过程中,如果某一位为0,那么就可以跳过与另外一个数字逐位相乘的过程
我们的计算过程分为两步:
- 首先拿一个数字中的的每一位数字和另一个数字中的每一位数字相乘,将乘积存入结果数组arr相应位置,暂时不考虑进位,这样就能够不用每次都计算一下进位
- 当每一位的数字都确定下来之后,我们再来计算进位,这样以来,每个位置都只需要计算一次进位
下面是代码部分,时间复杂度:6ms,97.82%;空间复杂度:36.1MB,91.41%。中间加上了详细的注解。
public class Solution_43 {
/**
* 时间复杂度:6ms,97.82%
* 空间复杂度:36.1MB,91.41%
*/
public String multiply(String num1, String num2) {
if (num1 == null || num1.isEmpty() || num2 == null || num2.isEmpty()) {
return "";
}
int len1 = num1.length();
int len2 = num2.length();
//将字符串先转为字符数组,然后转为整数数组,以便后面计算使用,避免重复计算增加时间复杂度
char[] chars1 = num1.toCharArray();
char[] chars2 = num2.toCharArray();
int[] ints1 = new int[len1];
int[] ints2 = new int[len2];
for (int i = 0; i < len1; i++) {
ints1[i] = chars1[i] - '0';
}
for (int i = 0; i < len2; i++) {
ints2[i] = chars2[i] - '0';
}
//按照乘法的规则,依次拿ints2中的每一个数字和ints1中的每一个数字相乘,将乘积存入结果数组arr相应位置,暂时不考虑进位
int len = len1 + len2;
int[] arr = new int[len];
for (int i = len2 - 1; i >= 0; i--) {
if (ints2[i] != 0) {//这里可以优化时间复杂度
for (int j = len1 - 1; j >= 0; j--) {
arr[i + j + 1] += ints1[j] * ints2[i];
}
}
}
//处理进位,因为最后的结果中每一位都应该是小于10的数字,大于部分向上进位
int carryOver = 0;
for (int i = len - 1; i >= 0; i--) {
int sum = arr[i] + carryOver;
carryOver = sum / 10;
arr[i] = sum % 10;
}
//为了使最终的结果不以0开头,需要标记开始的位置
int index = 0;
boolean flag = false;//标记结果是否存在非零数字
for (int i = 0; i < len; i++) {
if (arr[i] != 0) {
index = i;
flag = true;
break;
}
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = flag ? index : len - 1; i < len; i++) {
stringBuilder.append(arr[i]);
}
return stringBuilder.toString();
}
/* public static void main(String[] args) {
String multiply = new Solution_43().multiply("123", "456");
System.out.println(multiply);
}*/
}