Question
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note:
The numbers can be arbitrarily large and are non-negative.
Converting the input string to integer is NOT allowed.
You should NOT use internal library such as BigInteger.
本题难度Medium。
【复杂度】
时间 O(N*M) 空间 O(N+M+1)
【思路】
模拟手工运算
【注意】
1、两个数字相乘的最长位数不会超过两个数字的位数之和
2、在进行String->int[ ]
转换时(16-19行),是倒序转换,便于后面计算(21-16行)
3、对于输入参数其中一个为0
的情况要单独对待(10-11行),否则会出现结果如:"000"
,逻辑正确,但是不符合要求。
4、21-16行不能写成:
for(int i=0;i<size1;i++)
for(int j=0;j<size2;j++){
res[i+j]+=(n1[i]*n2[j])%10;
res[i+j+1]+=(n1[i]*n2[j])/10;
res[i+j]%=10;
}
如果res[i+j]+=(n1[i]*n2[j])%10;
得到的res[i+j]
是两位数呢?所以要先把res[i+j]
计算出来,这样进位数就是正确的。
5、有时候会出现"0123"
这种结果,也不符合要求,要对"0"
进行去除(29-30行)
【代码】
public class Solution {
public String multiply(String num1, String num2) {
//require
String ans="";
if(num1==null||num2==null)
return "0";
int size1=num1.length(),size2=num2.length();
if(size1<1||size2<1)
return "0";
if(num1.equals("0")||num2.equals("0"))
return "0";
//String -> int[]
int[] n1=new int[size1];
int[] n2=new int[size2];
int[] res=new int[size1+size2];
for(int i=0;i<size1;i++)
n1[size1-1-i]=num1.charAt(i)-'0';
for(int i=0;i<size2;i++)
n2[size2-1-i]=num2.charAt(i)-'0';
//invariant
for(int i=0;i<size1;i++)
for(int j=0;j<size2;j++){
res[i+j]+=n1[i]*n2[j];
res[i+j+1]+=res[i+j]/10;
res[i+j]%=10;
}
for(int i=0;i<res.length-1;i++)
ans=Integer.toString(res[i])+ans;
if(res[res.length-1]!=0)
ans=Integer.toString(res[res.length-1])+ans;
//ensure
return ans;
}
}