LeetCode (19) Multiply Strings
来源:互联网 发布:央视 可视化呀数据 编辑:程序博客网 时间:2024/05/18 02:11
题目描述
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
对两组非负数字进行相乘,使用数组表示数字,且题目中说明数组很大,因此,因此不能直接将数组转换成数字相乘。这道题目是要求自己构造乘法的思路,需要注意的地方主要为进位的处理。
解题思路
这道题目直接去计算不仅慢,而且很容易造成进位的错误,对于同一个数字上的值不仅来自相乘的结果,还有低位上进位的结果,且乘法不同于加法每次进位最多为1,只需要判断9的个数即可(类似字符串加1的题目可见:LeetCode (14) Plus One)。这里使用下面的思路就可以很优雅的解决问题了:
- 将字符串数字转换为从低位到高位存储的字符数组,即输入字符串string s1,变为数组int n1[s1.size()](这里实际写代码的时候当然要用动态数组了,这里是为了表示方便)。
- 对两个数组转成的数组按位相乘。即对数组n1和数组n2进行相乘,保存在数组n3中,需要注意的是n1[i]和n2[j]相乘的结果保存在n3[i+j]中。
- 对数组n3中的数字进行处理,对需要进位的数字进行进位。例如,n3[i]中的数字保留n3[i]/10的值在n3[i]中,对n3[i]%10的部分加入n3[i+1]中。
- 将n3的结果转为字符串数组string s3,并返回。需要注意的是n3的数组的低位在s3后面。
- 去除字符串s3前部的0.
在去除s3前面的0的时候需要注意从s3[0]处理到s3[s3.size()-2],避免两个0相乘的结果得到s3为”00”,所有0均被删除掉。
代码如下:
class Solution {public: void reverse(string& s) { int i = 0; int j = s.size() - 1; while (i < j) { swap(s[i++], s[j--]); } } string multiply(string num1, string num2) { reverse(num1); reverse(num2); int length = num1.size() + num2.size(); int* m = new int[length](); for (size_t i = 0; i != num1.size(); ++i) { for (size_t j = 0; j != num2.size(); ++j) { m[i + j] += (num1[i] - '0') * (num2[j] - '0'); } } string r; for (int i = 0; i != length; ++i) { int digit = m[i] % 10; int carry = m[i] / 10; if (i + 1 < length) { m[i + 1] += carry; } r.insert(0, 1, (digit + '0')); } int i = 0; while (r[i] == '0' && i < r.size()-1) ++i; r.erase(0, i); delete[] m; return r; }};
0 0
- LeetCode (19) Multiply Strings
- LeetCode: Multiply Strings
- LeetCode Multiply Strings
- LeetCode: Multiply Strings
- [Leetcode] Multiply Strings
- [LeetCode] Multiply Strings
- [Leetcode] Multiply Strings
- LeetCode 45: Multiply Strings
- [LeetCode]Multiply Strings
- [LeetCode] Multiply Strings
- LeetCode-Multiply Strings
- [leetcode] Multiply Strings
- LeetCode - Multiply Strings
- Leetcode: Multiply Strings
- LeetCode题解:Multiply Strings
- leetcode Multiply Strings
- LeetCode Multiply Strings
- LeetCode | Multiply Strings
- NDK开发环境搭建成功跑起JNI
- 机器学习算法(二)——决策树分类算法及R语言实现方法
- MFC 程序初始化
- mysql5.1忘记root密码找回密码以及mysql插入中文乱码问题解决
- 混淆Android JAR包的方法
- LeetCode (19) Multiply Strings
- arcgisengine中调用gp报错的问题
- C++ primer学习 1.4 if 语句
- 二维数组和指向指针的指针
- 算法的基本概念
- 关于win32 下DEBUG模式的研究
- java List转换为字符串并加入分隔符的一些方法总结
- IOS欢迎界面Launch Screen动态加载广告
- 当项目经理需要修炼的9件事