【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;
}
};
目录
相关文章
|
25天前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
31 1
|
1月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
24 9
|
1月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
17 0
|
1月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
28 0
|
1月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
19 0
|
1月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
20 0
|
1月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
14 0
|
3月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
3月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行