Multiply Strings - LeetCode

来源:互联网 发布:xp下安装linux双系统 编辑:程序博客网 时间:2024/06/04 18:10

思路:
如果num1有i位,num2有j位。结果最多有(i+j)位, 例如99*99 = 9801
结果中的某位置的数和两个乘数是有关的。
res[3]位 = num1的第0个数 * num2的第3个数 + num1的第1个数*num2的第2个数 + num1的第3个数+ num2的第0个数 + 进位。
注意:这里num1第0个数(最低位)是指i = 0, num[num1.length()-1-i]
注意:当一个数乘完还要将最后的进位放入下一位中。
注意:输入的数可能是“00001234” 太坏了。

v[i+num2.length()] += carry;

时间复杂度:
两个for循环,O(mn)

Code (C++):

class Solution {public:    string multiply(string num1, string num2) {        if(num1.length()==0 || num2.length()== 0) return 0;        vector<int> v(num1.length()+num2.length(), 0);        for(int i = 0; i < num1.length(); i++)        {            int a = num1[num1.length()-1-i]-'0';            int carry = 0;            for(int j = 0; j < num2.length(); j++)            {                int b= num2[num2.length()-1-j] - '0';                v[i+j] += a*b+carry;                carry = v[i+j]/10;                v[i+j]%=10;            }            v[i+num2.length()] += carry;        }        int i = v.size()-1;     //004321000,后面三个0,因为是高位的0所以一定是,"0001234"这样的string干的        while(i>0&&v[i]==0) i--;         string res = "";        while(i>=0)   //004321 => 123400            res += to_string(v[i--]);        return res;    }};
0 0
原创粉丝点击