每日一题——LeetCode43 字符串相乘

文章目录

    • 题目
    • 解法一

题目

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

示例 1:

输入: num1 = “2”, num2 = “3”
输出: “6”

示例 2:

输入: num1 = “123”, num2 = “456”
输出: “56088”

说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一

在解决这个题目之前,我们先明确一点:a为m位数,b为n位数,那么axb的位数一定处于[m+n-1, m+n]之间。关于这个这里就不详细推导了,很简单。

既然两数相乘最大可能的位数为m+n,那么我们首先设置一个数组v用于存储它们相乘的结果,数组的长度也为m+n。假设a"123"b"12",现在我们进行乘法运算,首先将对乘数b做分解,将a分别与12进行相乘,然后将对应位数的结果进行相加即可(类似于我们手动做乘法用的竖式运算方法)。

对应位上做乘法的结果我们存储到数组的对应位置上(v[m+n+1]),例如a[0]xb[0],这个结果我们放到v[1]中去,详见以下代码:

class Solution {
public:
    string multiply(string num1, string num2) {
        int n1 = num1.size(), n2 = num2.size(); 
        if(num1=="0" || num2=="0")    return "0";  // 任一字符串为"0",直接返回“0”
        string ans="";  
        vector<int> a(n1+n2, 0);  
        for(int i=0; i<n1; i++){
            int x=num1[i]-'0';
            for(int j=0; j<n2; j++){
                int y=num2[j]-'0';
                a[i+j+1] += x*y;  
            }
        }
        for(int t=n1+n2-1; t>=1; t--){  // 从右到左进行一次遍历,进位运算
            a[t-1] += a[t]/10;
            a[t] = a[t]%10;
        }
        for(int i=a[0]==0?1:0; i<n1+n2; i++){ // 数组转字符串
            ans += a[i]+'0';
        }
        return ans;
    }
};

复杂度分析
时间复杂度:O(m * n),m,n 分别为两个字符串长度
空间复杂度:O(m * n),数组开销

你可能感兴趣的:(每日一题)