Multiply Strings - LeetCode

思路:
如果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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值