[LeetCode]Multiply Strings

来源:互联网 发布:杭州软件测试培训班 编辑:程序博客网 时间:2024/06/05 22:45

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;    }}

参考

Leetcode: Multiply Strings

0 0