leetcode面试准备:Multiply Strings
1 题目
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.
接口: public String multiply(String num1, String num2);
2 思路
大整数的乘法,不能够简单用Integer.valueOf(String s)
,会产生溢出错误。
我们先来看一下289*758的计算过程:
首先我们把每一位相乘,得到一个没有进位的临时结果,如图中中间的一行红色数字就是临时结果(最多只有m + n - 1个,可以用数组保存),然后把临时结果从低位起依次进位。
对于一个m位整数乘以n位整数的结果,最后得到的结果最多是m+n
位。
因此,得出下面的算法:
1.翻转string
2.建立中间结果数组,循环遍历两个string,把单位的乘积累加到数组相应的位置
3.处理进位并输出
4.注意前导零的测试用例和测试用例(0,0)
我们有趣的发现, 红色的中间结果是有规律的:
- 109 = 88 + 95;这两对乘积所取的元素下标是(1,0)和(0,1),下标的和是1。
- 110 = 28 + 85 + 9*7;这三对乘积所取的元素下标是(2,0) (1,1) (0,2),下标的和是2。
利用这个特性,可以计算出中间结果数组。
复杂度: Time: O(n^2) ; Space: O(m + n)
3 代码
public String multiply(String num1, String num2) {
StringBuilder s1 = new StringBuilder(num1).reverse();
StringBuilder s2 = new StringBuilder(num2).reverse();
final int len1 = s1.length();
final int len2 = s2.length();
int[] tmp = new int[len1 + len2 - 1];
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
tmp[i + j] += (s1.charAt(i) - '0') * (s2.charAt(j) - '0');
}
}
StringBuilder result = new StringBuilder(len1 + len2);
for (int i = 0; i < tmp.length; i++) {
int mod = tmp[i] % 10;
int carry = tmp[i] / 10;
if (i + 1 < tmp.length) {
tmp[i + 1] += carry;
result.insert(0, mod);
} else {
result.insert(0, tmp[i]);
}
}
while (result.charAt(0) == '0' && result.length() > 1) {
result.deleteCharAt(0);
}
return result.toString();
}
4 总结
- 想出利用中间的乘积结果来计算乘积是关键。
- 如何求中间结果是有规律的。
5 扩展
更高效的计算大整数乘法一般有:
1.karatsuba算法,复杂度为3nlog3≈3n1.585,可以参考百度百科、面试题——大整数乘法、乘法算法-Karatsuba算法。
2.基于FFT(快速傅里叶变换)的算法,复杂度为o(nlogn), 可以参考FFT, 卷积, 多项式乘法, 大整数乘法
6 参考
leetcode面试准备:Multiply Strings的更多相关文章
- [Leetcode][Python]43: Multiply Strings
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 43: Multiply Stringshttps://leetcode.co ...
- 【LeetCode练习题】Multiply Strings
Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...
- 【LeetCode】43. Multiply Strings
Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...
- 【一天一道LeetCode】#43. Multiply Strings
一天一道LeetCode系列 (一)题目 Given two numbers represented as strings, return multiplication of the numbers ...
- 【LeetCode】43. Multiply Strings 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- LeetCode:43. Multiply Strings (Medium)
1. 原题链接 https://leetcode.com/problems/multiply-strings/description/ 2. 题目要求 给定两个String类型的正整数num1.num ...
- LeetCode OJ:Multiply Strings (字符串乘法)
Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...
- 【leetcode】43. Multiply Strings(大数相乘)
Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and ...
- LeetCode题解之Multiply Strings
1.题目描述 2.问题分析 按照手算乘法的过程进行计算,首先计算乘法,然后计算加法. 3.代码 string multiply(string num1, string num2) { string s ...
随机推荐
- linux下的oracle数据库和表空间的导入导出
由于oracle是安装在linux上面,因此需要oracle的导入导出都是使用命令进行操作.oracle允许整个数据库导入导出和表空间的导入导出. 数据库导入导出 以下操作是在操作系统控制台命令中执行 ...
- Mysql解压版的安装
Mysql解压版的安装 ——@梁WP 1.解压mysql到合适的地方 2.右击计算机-属性-高级系统设置-高级-环境变量,弹出“环境变量”对话框,修改下面的系统变量 3.新建MYSQL_HOME变量, ...
- 菱形实现气泡Bubble,菱形画箭头,菱形画三角形
菱形实现气泡Bubble,菱形画箭头,菱形画三角形 >>>>>>>>>>>>>>>>>>&g ...
- MYSQL批处理
待更新 版权声明:本文为博主原创文章,未经博主允许不得转载.
- CSS自动控制图片大小的代码
img { max-width: 800px; height: auto; } 代码中的max-width:800px限制图片的最大宽度为800像素,而下面的hight:auto很关键,可以保证图片有 ...
- PHP 数组的值插入
曾今写过一个坑货的数组方法 function array_insert($myarray,$value,$position=0) { $fore=($position==0)?array():a ...
- (转)Asp.net的HttpCookie写入汉字读取时为乱...
今天有个问我:在Asp.net的HttpCookie中写入汉字,读取值为什么全是乱码?其实这是因为文字编码而造成的,汉字是两个编码,所以才会搞出这么个乱码出来!其实解决的方法很简单:只要在写入Cook ...
- asp.net命名规范
以下命名规范是在编程中,可以辅助快速编程的良好方式之一,我一点点的整理出来,以便形成自己的编程规范.还有待完善... 0.产品命名规范: 结构 层次 产品 模块 功能 命名规则 UI(界面层) Web ...
- Ubuntu下解压rar文件的方法
原帖地址:http://hi.baidu.com/remoteexp/item/1c32d0ffb92e946c3c148596 一般通过默认安装的ubuntu是不能解压rar文件的,只有在安装了ra ...
- Java SE Java EE Java ME 的区别
Java SE(Java Platform,Standard Edition) Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.J ...