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的更多相关文章

  1. [Leetcode][Python]43: Multiply Strings

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 43: Multiply Stringshttps://leetcode.co ...

  2. 【LeetCode练习题】Multiply Strings

    Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...

  3. 【LeetCode】43. Multiply Strings

    Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...

  4. 【一天一道LeetCode】#43. Multiply Strings

    一天一道LeetCode系列 (一)题目 Given two numbers represented as strings, return multiplication of the numbers ...

  5. 【LeetCode】43. Multiply Strings 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. LeetCode:43. Multiply Strings (Medium)

    1. 原题链接 https://leetcode.com/problems/multiply-strings/description/ 2. 题目要求 给定两个String类型的正整数num1.num ...

  7. LeetCode OJ:Multiply Strings (字符串乘法)

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  8. 【leetcode】43. Multiply Strings(大数相乘)

    Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and ...

  9. LeetCode题解之Multiply Strings

    1.题目描述 2.问题分析 按照手算乘法的过程进行计算,首先计算乘法,然后计算加法. 3.代码 string multiply(string num1, string num2) { string s ...

随机推荐

  1. Android Studio使用SVN,与eclipse共同开发。

    Android Studio(下称AS)开发工具目前已经迅速在世界普遍使用起来,而在很多一部分公司内部,仍然有部分老员工坚持使用eclipse + SVN,而不改用AS,这使得想使用AS的小伙伴们都深 ...

  2. Android with Eclipse - Waiting for HOME ('android.process.acore') to be launched?

    mac机中使用命令行方式启动android sdk manager,有需要的朋友可以参考下. 相信使用mac机的用户做android开发都会有一个困惑,就是如何更新android sdk,或者说直接使 ...

  3. 基于Memcache的分布式缓存系统详解

    文章不是简单的的Ctrl C与V,而是一个字一个标点符号慢慢写出来的.我认为这才是是对读者的负责,本教程由技术爱好者成笑笑(博客:http://www.chengxiaoxiao.com/)写作完成. ...

  4. BrainTree信用卡包

    BrainTree是一个国外集成信用卡支付的卡包. 沙盒登陆地址: https://sandbox.braintreegateway.com/login 登陆沙盒得到商户ID.公钥.私钥. 1.配置w ...

  5. 30、ADO.NET、事务、DataSet

    ADO.NET ADO.NET是一组用于和数据源进行交互的面向对象类库.通常数据源是数据库,但也可以是文本文件.Excel表格.XML文件. 说白了就是使用.net操作数据库的一套类库. ADO.NE ...

  6. 什么是WordPress?

    (今天由于好友 肖知虎的 的需求 , 我开始了帮助小虎建站的需求, 就这样开始学习了Wordpress.  这些文章就是为了记录这些我在学习过程当中的心得,和记录下来的文字而已) 什么是WordPre ...

  7. javascript类继承系列一

    js中没有提供类(class,抽象类,接口等高级的抽象),可以用new,但new的function的对象,构造器 但在js中可以通过function来模拟类的一些特性function fun_name ...

  8. Shell: extract more from listener.log(分析监听日志)

    最近遇到了两起数据库连接数不足的问题, 通常都会预留一些会话增加的情况, 但在一些特殊情况下如连接风暴(logon storm), 如果在监听中没有做rate限流,对数据库来说巨大的冲击可能会导致数据 ...

  9. HTTP状态吗汇录

    页面Http状态查询工具说明 建议直接Ctrl+F来查找状态码 如果向您的服务器发出了某项请求要求显示您网站上的某个网页,那么,您的服务器会返回 HTTP 状态代码以响应该请求. 如果向您的服务器发出 ...

  10. 24种设计模式--装饰模式【Decorator Pattern】

    装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点 ...