43 Multiply Strings
2015-09-19 18:09
197 查看
题目链接:https://leetcode.com/problems/multiply-strings/
题目:
解题思路:
这个解题思路还是在做考研机试时学会的,运行时间相对较慢。但算法思路相对简单。
把两个大整数乘法拆分为:一个大整数乘以一个整数,两个大整数求和两个部分。
举例:123 * 234 = 28782
123 * 4 = 492
123 * 3 = 369
123 * 2 = 246
把上述乘积错位相加。
代码如下:
注:另一种思路很简便,从网上看到的
基本思路是和加法运算还是近似的,只是进位和结果长度复杂一些。我们仍然是从低位到高位对每一位进行计算,假设第一个数长度是n,第二个数长度是m,我们知道结果长度为m+n或者m+n-1(没有进位的情况)。对于某一位i,要计算这个位上的数字,我们需要对所有能组合出这一位结果的位进行乘法,即第1位和第i位,第2位和第i-1位,… ,然后累加起来,最后我们取个位上的数值,然后剩下的作为进位放到下一轮循环中。这个算法两层循环,每层循环次数是O(m+n),所以时间复杂度是O((m+n)^2)。算法中不需要额外空间,只需要维护一个进位变量即可,所以空间复杂度是O(1)。
参考链接:/article/1378326.html
题目:
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.
解题思路:
这个解题思路还是在做考研机试时学会的,运行时间相对较慢。但算法思路相对简单。
把两个大整数乘法拆分为:一个大整数乘以一个整数,两个大整数求和两个部分。
举例:123 * 234 = 28782
123 * 4 = 492
123 * 3 = 369
123 * 2 = 246
把上述乘积错位相加。
246 369 + 492 28782
代码如下:
public class Solution { public String multiply(String num1, String num2) { if(num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0) return null; if(num1.equals("0") || num2.equals("0")) return "0"; String preSum = "0"; for(int i = num2.length() - 1; i >= 0; i --) { String mul = multiply2(num1, num2.charAt(i) - '0'); StringBuilder sb = new StringBuilder(mul); for(int j = 0; j < num2.length() - i - 1; j ++) sb.append("0"); preSum = sum(preSum, sb.toString()); } return preSum; } String sum(String a, String b) { StringBuilder sb = new StringBuilder(); int i = a.length() - 1; int j = b.length() - 1; int carry = 0; while(i >= 0 && j >= 0) { int sum = (a.charAt(i) - '0') + (b.charAt(j) - '0') + carry; carry = sum / 10; sb.append(sum % 10); i --; j --; } while(i >= 0) { int sum = (a.charAt(i) - '0') + carry; carry = sum / 10; sb.append(sum % 10); i --; } while(j >= 0) { int sum = (b.charAt(j) - '0') + carry; carry = sum / 10; sb.append(sum % 10); j --; } if(carry != 0) sb.append(carry); return sb.reverse().toString(); } String multiply2(String num, int k) { StringBuilder sb = new StringBuilder(); int carry = 0; for(int i = num.length() - 1; i >= 0; i --) { int n = k * (num.charAt(i) - '0') + carry; carry = n / 10; sb.append(n % 10); } if(carry != 0) sb.append(carry); return sb.reverse().toString(); } }
311 / 311 test cases passed. Status: Accepted Runtime: 368 ms
注:另一种思路很简便,从网上看到的
基本思路是和加法运算还是近似的,只是进位和结果长度复杂一些。我们仍然是从低位到高位对每一位进行计算,假设第一个数长度是n,第二个数长度是m,我们知道结果长度为m+n或者m+n-1(没有进位的情况)。对于某一位i,要计算这个位上的数字,我们需要对所有能组合出这一位结果的位进行乘法,即第1位和第i位,第2位和第i-1位,… ,然后累加起来,最后我们取个位上的数值,然后剩下的作为进位放到下一轮循环中。这个算法两层循环,每层循环次数是O(m+n),所以时间复杂度是O((m+n)^2)。算法中不需要额外空间,只需要维护一个进位变量即可,所以空间复杂度是O(1)。
参考链接:/article/1378326.html
相关文章推荐
- OLE、ActiveX、COM、ATL联系与区别
- TelephonyManager
- 欢迎使用CSDN-markdown编辑器
- 不同钱币组合方案问题
- CocoaPods pod install/pod update更新卡住的问题
- Java的值传递和引用传递
- Emacs 编辑环境,第 6 部分: 自定义您的 Emacs 环境
- Emacs 编辑环境,第 5 部分: 确定您的 Emacs 视图的形状
- Log4J日志输出格式说明
- 仿QQ对话列表滑动删除与置顶的原理及实现
- IOS中的多线程实现:NSThread、GCD和NSOperation
- backBarButtonItem 替换
- 未来智能设备不再以视觉展现为主!
- Emacs 编辑环境,第 4 部分: 选项、寄存器和书签
- Lua和Luajit的优势和不足(1)
- android studio集成极光推送,获取附加字段详细,并提供自己写的一个demo,绝对不是官方demo
- 对GitHub的认识
- Emacs 编辑环境,第 3 部分: 高级 Emacs 文本操作
- 插入排序
- 2566:硬币统计