Leetcode 43. Multiply Strings

来源:互联网 发布:爱淘宝天猫购物券口令 编辑:程序博客网 时间:2024/06/04 20:14

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.

Note:

The length of both num1 and num2 is < 110.
Both num1 and num2 contains only digits 0-9.
Both num1 and num2 does not contain any leading zero.
You must not use any built-in BigInteger library or convert the inputs to integer directly.

s思路:
1. 乘法,但是string而不是int。
2. 需要什么技巧呢?直接来有啥问题?例如,

 99x99

3. 先根据输入确定输出最多有几位,然后初始化为全0,然后计算部分和,每次把部分和移位加在结果上即可!最后输出的时候,从左往右第一个非零的开始为结果!计算部分和,可以share一个string, 但每次都需要清零,为节约时间,可以初始化vector< string>,先计算好所有部分和,然后相加即可!
4. 实现方法1的时候,就是为了解决下面的矛盾:每次乘法时先计算个位,而在string中个位却保存在高byte位置,所以每次计算了乘法的低位,但是不知道存string那里,方法1就是先确定乘法的结果的位数,然后再放。即:这个矛盾才是这道题的题眼!
5. 看了答案,还是答案牛逼!我这个方法还是太麻烦,操作string的优势没有体现出来,和int比较,操作string可以轻松的实现reverse string, 先reverse,再相乘,再reverse back!
5. 为什么需要reverse? 把数据都reverse,则string的第byte位置就恰好存放乘法的低位,每次计算后就可以直接存放,没有矛盾了!矛盾在reverse的瞬间就消失了!对自己的启发:以后在遇到这样的矛盾时,可以想如何解决矛盾,比如reverse!

//方法1:class Solution {public:    string multiply(string num1, string num2) {        //        if(num1.size()<num2.size()) swap(num1,num2);        int n1=num1.size(),n2=num2.size();        int n=n1+n2;        vector<string> partial(n2,string(n,'0'));//初始化所有的部分和存储空间        string res(n,'0');        int k=n;        for(int i=n2-1;i>=0;i--){            int carry=0;            k--;            int endpos=k;            int cur=(num2[i]-'0');            for(int j=n1-1;j>=0;j--){                int prod=carry+cur*(num1[j]-'0');                partial[i][endpos--]=prod%10+'0';                carry=prod/10;            }            partial[i][endpos--]=carry+'0';        }        int carry=0;        for(int j=n-1;j>=0;j--){            int sum=carry;            for(int i=0;i<n2;i++){                sum+=partial[i][j]-'0';            }               res[j]=sum%10+'0';            carry=sum/10;        }        int nz=0;        while(nz<n&&res[nz]=='0'){//nz是none-zero            nz++;        }        return nz<n?res.substr(nz):"0";    }};//方法2:**reverse转化矛盾!**class Solution {public:    string multiply(string num1, string num2) {        //        reverse(num1.begin(),num1.end());        reverse(num2.begin(),num2.end());           int n1=num1.size(),n2=num2.size();        int n=n1+n2;        string res(n,'0');        for(int i=0;i<num1.size();i++){            int pos=i;            int cur=num1[i]-'0';            int carry=0;            for(int j=0;j<num2.size();j++){                int prod=carry+cur*(num2[j]-'0')+res[pos]-'0';                res[pos++]=prod%10+'0';                carry=prod/10;            }            if(carry) res[pos++]=carry+'0';         }           reverse(res.begin(),res.end());        int nz=0;        while(nz<n&&res[nz]=='0') nz++;        return nz<n?res.substr(nz):"0";    }};
0 0