【Leetcode】43. 字符串相乘

简介: 这是一个大数相乘的问题,类似于这篇文章中的高精度乘法 但是高精度乘法只是其中的一个数超过了整形的最大值。这里可以是两个数。所以我们需要进行一下数据的处理。

Halo,这里是Ppeua。平时主要更新C++,数据结构算法,Linux与ROS…感兴趣就关注我bua!


Leetcode 43



题目:


ca259b94198449c3adfceebc849e4830.png


示例:


f4aa24b9af364188b269c74a77a15fff.png


题解:


这是一个大数相乘的问题,类似于这篇文章中的高精度乘法 但是高精度乘法只是其中的一个数超过了整形的最大值。这里可以是两个数。所以我们需要进行一下数据的处理。


1.先将num1与num2进行一个string to int的处理:让其每一位都减去‘0’得到int中对应的数字


2.因为我们要做的是模拟笔算中的乘法,从个位开始算,所以要将其倒着存储:从后往前依次push到vector中


3.创建答案数组,将其num1(vector)与num2(vector)每一位相乘,放入对应下标和中,为什么要放入下标和中呢?


观察下面的式子就能明白啦。


15096a589b9841ddb43551d3bb2ba791.png


4.因为我们计算的时候是将这个结果直接存入对应的位数中,现在需要计算最后的结果,需要提取他们的个位数


5.因为最开始分配的空间是以num1.size()+num2.size()分配的,可能会出现计算的结果仅是五位数,而答案数组的空间是6位数的结果.需要去除数组尾端的0


6.最后将结果反转依次存入string中即可


详细图解:


15731cbc510348849bfd3f31572ae98a.png


代码实现:


class Solution {
public:
    string multiply(string num1, string num2) {
        vector<int>v1,v2;
        for(int i=num1.size()-1;i>=0;i--)v1.push_back(num1[i]-'0');
        for(int i=num2.size()-1;i>=0;i--)v2.push_back(num2[i]-'0');
        vector<int>ans(num1.size()+num2.size());
        for(int i=0;i<num1.size();i++)
        {
            for(int j=0;j<num2.size();j++)
            {
                ans[i+j]+=v1[i]*v2[j];
            }
        }
        int t=0;
        for(int i=0;i<ans.size();i++){
            t+=ans[i];
            ans[i]=t%10;
            t/=10;
        }
        int k=ans.size()-1;
        while(k>0&&ans[k]==0)k--;
        string res;
        while(k>=0)res+=ans[k--]+'0';
        return res;
    }
};


class Solution {
public:
string multiply(string num1, string num2) {
​ vectorv1,v2;
​ for(int i=num1.size()-1;i>=0;i–)v1.push_back(num1[i]-‘0’);
​ for(int i=num2.size()-1;i>=0;i–)v2.push_back(num2[i]-‘0’);
​ vectorans(num1.size()+num2.size());
​ for(int i=0;i<num1.size();i++)
​ {
​ for(int j=0;j<num2.size();j++)
​ {
​ ans[i+j]+=v1[i]*v2[j];
​ }
​ }
​ int t=0;
​ for(int i=0;i<ans.size();i++){
​ t+=ans[i];
​ ans[i]=t%10;
​ t/=10;
​ }
​ int k=ans.size()-1;
​ while(k>0&&ans[k]==0)k–;
​ string res;
​ while(k>=0)res+=ans[k–]+‘0’;
​ return res;
}
(k>0&&ans[k]==0)k–;
​ string res;
​ while(k>=0)res+=ans[k–]+‘0’;
​ return res;
}
};
目录
相关文章
|
2月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
2天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
22 5
|
2天前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
8 0
|
21天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
24 1
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
25天前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
2月前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
17 0
|
2月前
|
机器学习/深度学习 NoSQL Shell
力扣刷题-翻转字符串
力扣刷题-翻转字符串
12 1
|
2月前
|
算法 Java
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
24 0

热门文章

最新文章