43. 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
视频讲解
https://www.bilibili.com/video/BV1ba4y1J7yh/?spm_id_from=333.337.search-card.all.click&vd_source=46529616393a95d4e2cf01ffd22e20dc
方法一:做加法
方法一思路
方法一图解
借鉴
我们先来看一下415. 字符串相加
给定两个字符串形式的非负整数 `num1` 和`num2` ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 `BigInteger`), 也不能直接将输入的字符串转换为整数形式。
思路
代码
class Solution {
public String addStrings(String num1, String num2) {
int i = num1.length() - 1, j = num2.length() - 1, add = 0;
StringBuffer ans = new StringBuffer();
while (i >= 0 || j >= 0 || add != 0) {
int x = i >= 0 ? num1.charAt(i) - '0' : 0;
int y = j >= 0 ? num2.charAt(j) - '0' : 0;
int result = x + y + add;
ans.append(result % 10);
add = result / 10;
i--;
j--;
}
// 计算完以后的答案需要翻转过来
ans.reverse();
return ans.toString();
}
}
方法一最终代码
class Solution {
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
String ans = "0";
int m = num1.length(), n = num2.length();
for (int i = n - 1; i >= 0; i--) {
StringBuffer curr = new StringBuffer();
//add用于维护是否有进位
int add = 0;
for (int j = n - 1; j > i; j--) {
curr.append(0);
}
int y = num2.charAt(i) - '0';
for (int j = m - 1; j >= 0; j--) {
int x = num1.charAt(j) - '0';
int product = x * y + add;
curr.append(product % 10);
add = product / 10;
}
if (add != 0) {
curr.append(add % 10);
}
ans = addStrings(ans, curr.reverse().toString());
}
return ans;
}
public String addStrings(String num1, String num2) {
//add用于维护是否有进位
int i = num1.length() - 1, j = num2.length() - 1, add = 0;
StringBuffer ans = new StringBuffer();
while (i >= 0 || j >= 0 || add != 0) {
int x = i >= 0 ? num1.charAt(i) - '0' : 0;
int y = j >= 0 ? num2.charAt(j) - '0' : 0;
int result = x + y + add;
ans.append(result % 10);
add = result / 10;
i--;
j--;
}
ans.reverse();
return ans.toString();
}
}
方法二:做乘法
思路
代码
public class DoubleNumberMultiply {
public String multiply(String num1, String num2) {
int numLen1 = num1.length();
int numLen2 = num2.length();
int[] ansArr=new int[numLen1+numLen2];
for (int i = numLen1-1; i >=0 ; i--) {
int x=num1.charAt(i)-'0';
for (int j = numLen2-1; j >=0 ; j--) {
// 此处一定要加1,这时如果ansArr[0]==0,则可以直接忽略了,
// 要不然容易导致结果多了个0
ansArr[i+j+1]+=x*(num2.charAt(j)-'0');
}
}
for (int i = ansArr.length-1; i >0 ; i--) {
ansArr[i-1]+=ansArr[i]/10;
ansArr[i]%=10;
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < ansArr.length; i++) {
if(i==0&&ansArr[0]==0){
continue;
}
builder.append(ansArr[i]);
}
return builder.toString();
}
}