【leetcode】43. 字符串相乘(multiply-strings)(模拟)[中等]

215 篇文章 0 订阅
66 篇文章 0 订阅

链接

https://leetcode-cn.com/problems/multiply-strings/

耗时

解题:1 h
题解:10 min

题意

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

思路

将 num1 和 num2 分别 反向 转成 数组(0~n-1 分别存储最底位到最高位),然后乘法的结果最多是 n1+n2 这么长,开一个 n1+n2 这么长的结果数组。每一位数字分别进行乘法,结果数字的位数是两个乘数的位数相加。然后顺序进位。最后去掉前导零,将剩余的数字逆序放入结果字符串中。

时间复杂度: O ( n 1 ∗ n 2 ) O(n1*n2) O(n1n2)

AC代码

class Solution {
public:
    string multiply(string num1, string num2) {
        int n1 = num1.size();
        int n2 = num2.size();
        vector<int> a, b, res(n1+n2+10, 0);
        for(int i = n1-1; i >= 0; --i) a.push_back(num1[i]-'0');
        for(int i = n2-1; i >= 0; --i) b.push_back(num2[i]-'0'); 

        for(int i = 0; i < n1; ++i) {
            for(int j = 0; j < n2; ++j) {
                res[i+j] += a[i]*b[j];
            }
        }
        
        int add = 0, i = 0;
        while(i < res.size() || add > 0) {
            int tmp = res[i]+add;
            res[i] = tmp%10;
            add = tmp/10;
            i++;
        }
        
        string ans;
        i = res.size()-1;
        while(i > 0 && res[i] == 0) i--; 
        for(; i >= 0; --i) {
            ans.push_back(res[i]+'0');
        }
        
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值