题目链接
题目描述
给定两个以字符串形式表示的非负整数 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) {// 特殊情况,某个数为0if(num1.equals("0")||num2.equals("0")){return "0";}String tmp;String res = "";// num2从高位到低位,先乘结果*10加后面的结果for(int i = 0;i<num2.length();++i){// 当前位和num1相乘tmp = multi(num1, num2.charAt(i));// 加上之前的结果res = add(res,tmp);}return res;}// 字符串乘法private String multi(String s,char c){StringBuilder sb = new StringBuilder();int tmp;int x = 0;for(int i = s.length()-1;i>=0;--i){tmp = (s.charAt(i)-'0')*(c-'0') + x;sb.append(tmp%10);x = tmp/10;}if(x!=0){sb.append(x);}return sb.reverse().toString();}// 字符串加法private String add(String s,String c){StringBuilder sb = new StringBuilder();// 先把c的最后一位加上,相当于s*10,个位结果是0+c[c.length()-1]sb.append(c.charAt(c.length()-1));int tmp;int x = 0;int i = s.length()-1,j = c.length()-2;while(i>=0||j>=0){int x1 = i>=0? s.charAt(i--) - '0':0;int x2 = j>=0? c.charAt(j--) - '0':0;tmp = x1 + x2 + x;sb.append(tmp%10);x = tmp/10;}if(x!=0){sb.append(x);}return sb.reverse().toString();}
class Solution {public String multiply(String num1, String num2) {// 特殊情况,某个数为0if(num1.equals("0")||num2.equals("0")){return "0";}int m = num1.length(),n = num2.length();// 两个数相乘 结果长度最大为m+n最小为m+n-1int[] res = new int[m+n];for(int i = m - 1;i>=0;--i){// num1中第i位数和num2中所有数相乘int x = num1.charAt(i) - '0';for(int j = n-1;j>=0;--j){int y = num2.charAt(j) - '0';// 结果加入相应的位置// 第一个数对应m+n-1的位置 以此向前移动res[i+j+1] += x * y;}}// 将各个位置的数分配,使之成为10进制for(int i = m+n-1;i>0;--i){res[i-1] += res[i]/10;res[i] %= 10;}// 如果第一位为0 则从第二位开始遍历字符串int index = res[0] == 0? 1:0;StringBuilder sb = new StringBuilder();while(index<m+n){sb.append(res[index++]);}return sb.toString();}}
class Solution {
public String multiply(String num1, String num2) {
if(num1.length() == 0 || num2.length() == 0){
return "0";
}
char[] arr1 = num1.toCharArray();
char[] arr2 = num2.toCharArray();
if(arr1[0] == '0' || arr2[0] == '0'){
return "0";
}
int[] res = new int[arr1.length + arr2.length];
// 竖式乘法
for(int x = arr1.length - 1; x >= 0; --x){
int i = arr1[x] - '0';
for(int y = arr2.length - 1; y >= 0; --y){
int j = arr2[y] - '0';
res[x + y] += (res[x + y + 1] + i * j)/10;
res[x + y + 1] = (res[x + y + 1] + i * j)%10;
}
}
StringBuilder sb = new StringBuilder();
int pos = 0;
if(res[0] == 0){
++pos;
}
while(pos < res.length){
sb.append(res[pos++]);
}
return sb.toString();
}
}
- 时间复杂度 O(mn)
- 空间复杂度 O(m + n)
