当前位置: 首页 > news >正文

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本身。

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
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

请添加图片描述

http://www.lryc.cn/news/290583.html

相关文章:

  • PalWorld/幻兽帕鲁Ubuntu 22.04 LTS 一键部署脚本
  • 【Vue】Vue3.0样式隔离
  • Git初识
  • OpenHarmony隐藏应用(应用不在桌面显示,隐藏应用图标)
  • 2024年新提出的算法:(凤头豪猪优化器)冠豪猪优化算法Crested Porcupine Optimizer(附Matlab代码)
  • vue3 el-pagination 将组件中英文‘goto’ 修改 为 中文到‘第几’
  • 【蓝桥杯日记】复盘篇二:分支结构
  • Vulnhub靶机:hackme1
  • 【C/C++ 06】基数排序
  • Flume1.9基础学习
  • ThinkPHP6的助手函数汇总
  • ·备忘录模式
  • docker-学习-2
  • 树--二叉树(C语言纯手凹)
  • TypeScript(七) 函数
  • 学fpga和还是嵌入式?
  • Day01-变量和数据类型课后练习-参考答案
  • Docker 数据管理、容器互联、网络与资源控制
  • 密码加密——MD5与BCryptPasswordEncoder
  • 利用外卖系统源码构建高效的在线订餐平台
  • 数据分析数据 -(用数据讲故事)
  • 如何运用5W2H分析法分析自己适合哪种办公室
  • 为什么考虑电子采购而非传统采购?
  • 【git】git update-index --assume-unchanged(不改动.gitignore实现忽略文件)
  • 科普类——无压缩图像传输带宽的计算(七)
  • 云原生周刊:K8s 1.26 到 1.29 版本的更新 | 2024.1.29
  • 手机壳也能散热了?
  • 《微信小程序开发从入门到实战》学习九十七
  • 二极管漏电流对单片机ad采样偏差的影响
  • 三、防御保护---防火墙安全策略篇