每日题解:LeetCode 43. 字符串相乘
题目描述
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
解法
class Solution {
public String multiply(String num1, String num2) {
int m = num1.length(), n = num2.length();
int[] res=new int[m + n];
for (int i = m-1; i >=0; i--) {
for (int j = n-1; j >=0; j--) {
int mul = (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
int p1 = i + j, p2 = i + j + 1;
int sum = mul + res[p2];
res[p2] = sum % 10;
res[p1] += sum / 10;
}
}
int i = 0;
String ans="";
while (i < res.length) {
if(res[i] == 0 && ans.length()==0){
i++;
continue;
}
ans+=res[i++];
}
return ans.length() == 0 ? "0" : ans;
}
}
解题思路
竖式乘法
按照计算乘法的习惯,我们一般如图所示计算两个数相乘
所以就可以模拟竖式的作法计算字符串相乘的结果
这里以数组记录相应位上的数字,两个数相乘,其结果个数最高为num1.length()+num2.length(),
int m = num1.length(), n = num2.length();
int[] res=new int[m + n];
for (int i = m-1; i >=0; i--) {
for (int j = n-1; j >=0; j--) {
//计算出积
int mul = (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
}
}
比如num2=6
,其i=2
;当j=2
,即mun1=3
,计算结果为18
,res
数组的长度为6,第一位在数组下标4,第二位在下标5
发现规律,第一位在i+j
;第二位在i + j + 1
,如果第一位不存在,补零处理
for (int i = m-1; i >=0; i--) {
for (int j = n-1; j >=0; j--) {
int mul = (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
//在数组的下标
int p1 = i + j, p2 = i + j + 1;
//计算上一步的累加值
int sum = mul + res[p2];
res[p2] = sum % 10;
//计算是否需要进位
res[p1] += sum / 10;
}
}
计算完,遍历数组
int i = 0;
String ans="";
while (i < res.length) {
//这里处理数组开始为0的值,比如10*99;数组为0990
if(res[i] == 0 && ans.length()==0){
i++;
continue;
}
ans+=res[i++];
}