43. 字符串相乘

1.题目描述

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
43. 字符串相乘
示例 2:
43. 字符串相乘
说明:
1.num1 和 num2 的长度小于110。
2.num1 和 num2 只包含数字 0-9。
3.num1 和 num2 均不以零开头,除非是数字 0 本身。
4.不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

2.思路

(1)乘数 num1 位数为 M,被乘数 num2 位数为 N,则 num1 x num2 结果 res 最大总位数为 M+N
(2)num1[i] x num2[j] 的结果为 num(位数为两位,“0x”,"xy"的形式),其第一位位于 res[i+j],第二位位于 res[i+j+1],如下图所示。
43. 字符串相乘

3.代码

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1 == "0" || num2 == "0"){
            return "0";
        }
        vector<int> res_vec(num1.size() + num2.size());
        for(int i = num1.size() - 1; i >= 0; --i){
            int n1 = num1[i] - '0';
            for(int j = num2.size() - 1; j >= 0; --j){
                int n2 = num2[j] - '0';
                int num = res_vec[i + j + 1] + n1 * n2;
                res_vec[i + j + 1] = num % 10;
                res_vec[i + j] += num / 10;
            }
        }
        string res = "";
        for(int i = 0; i < res_vec.size(); ++i){
            if(i == 0 && res_vec[i] == 0){
                continue;
            }
            res += to_string(res_vec[i]);
        }

        return res;
    }
};

4.复杂度分析

时间复杂度:O(MN)
空间复杂度:O(M+N)

上一篇:常用网址


下一篇:剑指 Offer 43. 1~n 整数中 1 出现的次数