LeetCode —— 43. 字符串相乘


😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️

💥个人主页:🔥🔥🔥大魔王🔥🔥🔥

💥所属专栏:🔥魔王的修炼之路--C++🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞 👍和关注 💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。

43. 字符串相乘

这个相当于是字符串相加的进阶版,需要用到字符串相加实现的内容。
几个月前做过一遍都做了好几个小时,这次又做有用了好几个小时

之前的思路是每次用完数据pop,这次的实现是通过对迭代器的控制

花了三四个小时,无语了,总结出来就两个大问题:

  1. 对于任何情况的位数0都不应该在转换为int时去管,因为整形的存储空间就那么大,但是字符串可以无限大,所以就算不算数据部分,对于比较长的字符串最后也会把整型给撑爆,long long也不行,解决方法就是先将这一次要加的0记起来然后等要计算这次字符串相加时也就是把整型转换为了字符串时再补上这一次的0.
  2. 不能先将其中一个字符串转换为整型然后只用一层for循环对另一个字符串的数据进行遍历相加,就算是long long也接收不了每次这么大的整型,必须用两层for循环分别让两个数的每位相乘完立即相加到字符串上。
    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"

输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"

输出: "56088"

提示:

1 <= num1.length, num2.length <= 200

num1 和 num2 只能由数字组成。

num1 和 num2 都不包含任何前导零,除了数字0本身。

cpp 复制代码
class add {
public:
    string addStrings(string num1, string num2) {
        string s;
        int n1 = 0, n2 = 0;
        int flag = 0;
        int sum = 0;
        if (num1.size() == 0)
            return num2;
        else if (num2.size() == 0)
            return num1;
        string::iterator cur1 = num1.end() - 1;
        string::iterator cur2 = num2.end() - 1;
        while (cur1 >= num1.begin() || cur2 >= num2.begin())
        {
            n1 = cur1 >= num1.begin() ? *cur1 - '0' : 0;
            n2 = cur2 >= num2.begin() ? *cur2 - '0' : 0;//等到越界的时候也没事,因为三目操作符会选择性执行,只会去比那块的地址,不会访问进去。
            sum = n1 + n2 + flag;
            flag = 0;
            if (sum > 9)
            {
                flag = 1;
                sum -= 10;
            }
            s += sum + '0';
            cur1--;
            cur2--;
        }
        if (flag)
            s += 1 + '0';
        reverse(s.begin(), s.end());
        return s;
    }
};

class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == string("0") || num2 == "0")
            return string("0");
        string s;
        long long num1_tmp = 0;
        long long num2_tmp = 0;
        //不能一下子让num1变为整数,因为就算是long long 也存不下,所以要套两层循环,让它们每个位都相乘
        // for (auto x : num1)
        // {
        //     cout << (x - '0') << ' ';
        //     s_num1 += (x - '0') * pow(10, num1.size() - 1 - system++);
        //     cout << s_num1 << endl;
        // }
        // cout << s_num1 << endl;
        int system1 = 0;
        int system2 = 0;
        string::iterator it1 = num1.end() - 1;

        while(it1 >= num1.begin())
        {
            system2 = 0;
            string product_s;
            num1_tmp = *it1 - '0';
            string::iterator it2 = num2.end() - 1;
            while(it2 >= num2.begin())
            {
                int system = system1 + system2;
                int product = 0;
                num2_tmp = *it2 - '0';
                product = num1_tmp * num2_tmp;
                while (product > 9)
                {
                    int n = product % 10;
                    product_s += n + '0';
                    product /= 10;
                }
                product_s += product + '0';
                reverse(product_s.begin(), product_s.end());
                for(int i = 0; i < system; i++)
                    product_s += '0';
                
                // cout << s << endl;
                // cout << product_s << endl;
                s = add().addStrings(s,product_s);
                // cout << s << endl;
                product_s.clear();
                system2++;
                it2--;
            }
            system1++;
            it1--;
        }
        return s;
    }
};
  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

🌈专栏推荐
😈魔王的修炼之路--C语言
😈魔王的修炼之路--数据结构初阶
😈魔王的修炼之路--C++
😈魔王的修炼之路--Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

相关推荐
running_bug_Hu2 分钟前
深度优先算法与拓扑排序之间的关系(C语言)
c语言·算法·深度优先
@haihi17 分钟前
Qt中常用类和函数解释
开发语言·c++·qt
__AtYou__32 分钟前
Golang | Leetcode Golang题解之第437题路径总和III
leetcode·golang·题解
燕双嘤1 小时前
Require:基于雪花算法完成一个局部随机,全局离散没有热点切唯一的数值Id生成器。
算法·dreamweaver
wht65871 小时前
Linux--基本指令
linux·运维·服务器·c语言·开发语言·jvm·c++
了无痕13141 小时前
8-回溯算法
算法
问道飞鱼1 小时前
每日学习一个数据结构-堆
数据结构·学习·算法
liuyunluoxiao1 小时前
普通二叉搜索树的模拟实现【C++】
c++
ad_l2 小时前
代码随想录_刷题记录_第四次
笔记·算法·leetcode
cdut_suye2 小时前
STL之list篇(上)初识list容器,了解其核心机制,实例化对象进行分析
开发语言·c++·学习·算法·stl·list