题目
题解
class Solution {
public String multiply(String num1, String num2) {
if(num1.equals("0")||num2.equals("0"))
return "0";
int m=num1.length(),n=num2.length();
String res="0";
for(int i=n-1;i>=0;i--){
StringBuffer cur=new StringBuffer();
//补零
for(int j=0;j<n-i-1;j++)
cur.append(0);
//逐位相乘
int y=num2.charAt(i)-'0',add=0;
for(int j=m-1;j>=0;j--){
int x=num1.charAt(j)-'0';
int sum=x*y+add;
cur.append(sum%10);
add=sum/10;
}
if(add>0)
cur.append(add);
//相加
res=addStrings(res,cur.reverse().toString());
}
return res;
}
//字符串相加(力扣417)
public String addStrings(String num1, String num2) {
int m=num1.length(),n=num2.length();
int i=m-1,j=n-1,add=0;
StringBuffer res=new StringBuffer();
while(i>=0||j>=0||add>0){
int n1=i>=0?num1.charAt(i--)-'0':0;
int n2=j>=0?num2.charAt(j--)-'0':0;
res.append((char)((n1+n2+add)%10+'0'));
add=(n1+n2+add)/10;
}
return res.reverse().toString();
}
}
时间复杂度: O ( m n + n 2 ) O(mn+n^2) O(mn+n2),其中 m 和 n 分别是num1和num2的长度。num2的每一位都要与num1相乘,计算乘积总次数为mn;字符串相加操作共n次,最长字符串可能为m+n,因此次数为m(m+n)。
空间复杂度: O ( m + n ) O(m+n) O(m+n),存储结果的字符串大小,最长为m+n
p.s 逐渐变成挑战最长断签记录…