每天一道LeetCode-----字符串乘法
来源:互联网 发布:nginx lua redis性能 编辑:程序博客网 时间:2024/06/05 21:15
原题链接Multiply Strings
意思是给两个字符串,代表两个整数,求这两个整数的积,以字符串的形式返回
主要注意的地方在这两个字符串可能很长,远远超过了long long int所表示的范围,所以当初耍小聪明直接用std::stringstream获取两个整数再相乘就果断的溢出了
所以这种问题还是实打实的用字符串计算比较好,当然需要点技巧,算法题很少用蛮力法硬算的…
首先还是找规律,对于字符串1的某一位乘字符串2的某一位,乘积的结果在整个结果的哪一位呢,能不能找到某种规律直接定位,这样就简单多了。
先看一下乘法运算
/* 以下a * b表示num1[a] * num2[b] */ num1[0] num1[1] num1[2] * num2[0] num2[1] num2[2]-------------------------------------------------- 0 * 2 1 * 2 2 * 2 0 * 1 1 * 1 2 * 10 * 0 1 * 0 2 * 0----------------------------------------------------------
上式中直接用下标代表对应位的值,乘号左边代表num1
的值,右边代表num2
的值,比如0 * 1代表num1[0] * num2[1]
注意这里,0*0中0+0=0
,正好是结果的第0位,0*1中0+1=1
,1*0中1+0=1
刚好是结果的第1位
所以根据下标很容易定位到结果的位置
又因为0*0可能会进位,所以在结果中每一位都后移一位,即0*0是第1位….,第0位用来存最后的进位
这样代码就容易写出了
class Solution {public: string multiply(string num1, string num2) { if(num1 == "0" || num2 == "0") return "0"; int n1 = num1.size(); int n2 = num2.size(); string res(n1 + n2, '0'); for(int i = n1 - 1; i >= 0; --i) { for(int j = n2 - 1; j >= 0; --j) { int lhs = num1[i] - '0'; int rhs = num2[j] - '0'; /* 这里要注意的问题时,当把进位加给res[i+j]时,res[i+1]仍然可能继续向高位进位 */ /* 但是不需要直接处理这种情况,在下次处理到res[i+j]时,一定会将进位进到高位 */ /* 因为res[i+j]一定在res[i+j+1]后面处理 */ int num = lhs * rhs + (res[i + j + 1] - '0'); res[i + j + 1] = (num % 10) + '0'; res[i + j] = res[i + j] + num / 10; } } /* 比如两个3位数相乘结果位数可能是5位或6位,6位时是次高位向高位有进位,此时res中没有前导0 */ /* 而5位时说明没有进位,那么res[0]将是0,结果应该把这个前导0去掉,因为初始时res设成6位 */ return res.substr(res.find_first_not_of('0')); }};
阅读全文
0 0
- 每天一道LeetCode-----字符串乘法
- 每天一道LeetCode-----括号匹配
- 每天一道LeetCode-----数独盘求解
- 每天一道LeetCode-----生命游戏
- 每天一道LeetCode-----只可能有'.'和'*'的字符串正则匹配
- 每天一道LeetCode-----将字符串拆分成有效的ip地址
- 每天一道LeetCode-----找到一个字符串在另一个字符串出现的位置,字符串内部顺序无要求
- 每天一道leetcode题目_(1)
- 【每天一道leetcode】1:N-Queens
- 每天一道LeetCode-----回文链表
- 每天一道LeetCode-----重新实现next_permutation
- 每天一道LeetCode-----n皇后问题
- 每天一道LeetCode-----化简路径
- 每天一道LeetCode-----逆序链表
- 每天一道LeetCode-----将字符串的连续相同的字符合并成一个字符后加个数
- 每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
- 每天一道LeetCode-----使用最少的操作将一个字符串转换成另一个字符串,只有插入,删除,替换三种操作
- 每天一道LeetCode-----最长无重复子串
- Java-方法重载与重写
- MVP模式 + RecyclerView瀑布流 + 上拉加载、下拉刷新
- C/C++ 输出间隔控制
- HDU-3966 Aragorn's Story (树链剖分 树状数组 区间修改 点查询)(2011 Multi-University Training Contest 13)
- 第四章、XML集成(定义XML数据列、XML模式集合、XML数据类型方法 .query,.value,.modify,.nodes,.exists),关系数据转成XML
- 每天一道LeetCode-----字符串乘法
- Hadoop中Context类的作用
- 使用scrapy对大学生互联网+科技创业大赛的爬取
- 刚出来工作的程序员应当如何对待工作和学习的个人看法。
- 10.13日课程复习
- Opencv HighGUI函数_用鼠标在窗口中画方形
- CS231_A1:Two-layer Neural Net
- 数组总结
- LANP 环境搭建,git配置,ftp配置等