43. 字符串相乘
题目描述:给定两个以字符串形式表示的非负整数
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本身。
代码思路:
-
代码获取了输入字符串的长度,并创建了一个数组
temp
用于存储中间结果,其长度为len1 + len2 - 1
。这是因为两个长度分别为len1
和len2
的数字相乘的结果的最大位数为len1 + len2
,但是最高位不会在中间结果中出现。 -
接着,两层循环遍历每一位数字,并将它们两两的乘积加到
temp
数组的对应位置上。 -
然后,通过一个循环来处理进位,将
temp
数组中的每一位进行进位处理,确保每一位都在 0 到 9 之间。 -
最后,代码使用 StringBuilder 将
temp
数组中的每一位数字转换为字符串,并返回结果。
示例:
class Solution {
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) return "0";
int len1 = num1.length();
int len2 = num2.length();
int[] temp = new int[len1 + len2 - 1];
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
temp[i + j] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
}
}
for (int i = len1 + len2 - 2; i > 0; i--) {
temp[i - 1] += temp[i] / 10;
temp[i] %= 10;
}
StringBuilder sb = new StringBuilder();
for (int x : temp) sb.append(x);
return sb.toString();
}
}