Leetcode 43. Multiply Strings
来源:互联网 发布:爱淘宝天猫购物券口令 编辑:程序博客网 时间:2024/06/04 20:14
Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.
Note:
The length of both num1 and num2 is < 110.
Both num1 and num2 contains only digits 0-9.
Both num1 and num2 does not contain any leading zero.
You must not use any built-in BigInteger library or convert the inputs to integer directly.
s思路:
1. 乘法,但是string而不是int。
2. 需要什么技巧呢?直接来有啥问题?例如,
99x99
3. 先根据输入确定输出最多有几位,然后初始化为全0,然后计算部分和,每次把部分和移位加在结果上即可!最后输出的时候,从左往右第一个非零的开始为结果!计算部分和,可以share一个string, 但每次都需要清零,为节约时间,可以初始化vector< string>,先计算好所有部分和,然后相加即可!
4. 实现方法1的时候,就是为了解决下面的矛盾:每次乘法时先计算个位,而在string中个位却保存在高byte位置,所以每次计算了乘法的低位,但是不知道存string那里,方法1就是先确定乘法的结果的位数,然后再放。即:这个矛盾才是这道题的题眼!
5. 看了答案,还是答案牛逼!我这个方法还是太麻烦,操作string的优势没有体现出来,和int比较,操作string可以轻松的实现reverse string, 先reverse,再相乘,再reverse back!
5. 为什么需要reverse? 把数据都reverse,则string的第byte位置就恰好存放乘法的低位,每次计算后就可以直接存放,没有矛盾了!矛盾在reverse的瞬间就消失了!对自己的启发:以后在遇到这样的矛盾时,可以想如何解决矛盾,比如reverse!
//方法1:class Solution {public: string multiply(string num1, string num2) { // if(num1.size()<num2.size()) swap(num1,num2); int n1=num1.size(),n2=num2.size(); int n=n1+n2; vector<string> partial(n2,string(n,'0'));//初始化所有的部分和存储空间 string res(n,'0'); int k=n; for(int i=n2-1;i>=0;i--){ int carry=0; k--; int endpos=k; int cur=(num2[i]-'0'); for(int j=n1-1;j>=0;j--){ int prod=carry+cur*(num1[j]-'0'); partial[i][endpos--]=prod%10+'0'; carry=prod/10; } partial[i][endpos--]=carry+'0'; } int carry=0; for(int j=n-1;j>=0;j--){ int sum=carry; for(int i=0;i<n2;i++){ sum+=partial[i][j]-'0'; } res[j]=sum%10+'0'; carry=sum/10; } int nz=0; while(nz<n&&res[nz]=='0'){//nz是none-zero nz++; } return nz<n?res.substr(nz):"0"; }};//方法2:**reverse转化矛盾!**class Solution {public: string multiply(string num1, string num2) { // reverse(num1.begin(),num1.end()); reverse(num2.begin(),num2.end()); int n1=num1.size(),n2=num2.size(); int n=n1+n2; string res(n,'0'); for(int i=0;i<num1.size();i++){ int pos=i; int cur=num1[i]-'0'; int carry=0; for(int j=0;j<num2.size();j++){ int prod=carry+cur*(num2[j]-'0')+res[pos]-'0'; res[pos++]=prod%10+'0'; carry=prod/10; } if(carry) res[pos++]=carry+'0'; } reverse(res.begin(),res.end()); int nz=0; while(nz<n&&res[nz]=='0') nz++; return nz<n?res.substr(nz):"0"; }};
- [LeetCode]43.Multiply Strings
- LeetCode --- 43. Multiply Strings
- [Leetcode] 43. Multiply Strings
- [leetcode] 43.Multiply Strings
- 43. Multiply Strings LeetCode
- leetcode 43. Multiply Strings
- LeetCode 43. Multiply Strings
- LeetCode 43. Multiply Strings
- LeetCode 43. Multiply Strings
- [leetcode] 43. Multiply Strings
- Leetcode 43. Multiply Strings
- (Leetcode)43. Multiply Strings
- LeetCode - 43. Multiply Strings
- leetcode 43. Multiply Strings
- [LeetCode] 43. Multiply Strings
- leetcode 43. Multiply Strings
- Leetcode 43. Multiply Strings
- leetcode 43. Multiply Strings
- [RTL综合]综合时保持RTL中直接写入的cell的层级
- scp简单使用
- poj1795(状态压缩dp,字符串压缩求最小字典序)
- NYOJ599 - 奋斗的小蜗牛
- Leetcode 345. Reverse Vowels of a String
- Leetcode 43. Multiply Strings
- 模拟栈的出入 HDOJ 1022 Train Problem I
- Spring 的aop实现原理
- PLSQL游标的使用
- Educational Codeforces Round 17 A+B
- SuperSocket入门(五)-常用协议实现模版及FixedSizeReceiveFilter示例_0
- C语言经典弱智问题解法整理
- dk uma creator 添加装备教程
- jsp_04 自定义标签