zoukankan      html  css  js  c++  java
  • 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的计算过程:
    photo
    首先我们把每一位相乘,得到一个没有进位的临时结果,如图中中间的一行红色数字就是临时结果(最多只有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 参考

  • 相关阅读:
    Heartbeat+Haproxy实现负载均衡高可用
    Heartbeat+Haproxy实现负载均衡高可用
    Heartbeat+Haproxy实现负载均衡高可用
    Heartbeat+Haproxy实现负载均衡高可用
    apache调优技巧之一隐藏apahce版本信息
    apache调优技巧之一隐藏apahce版本信息
    apache调优技巧之一隐藏apahce版本信息
    apache调优技巧之一隐藏apahce版本信息
    用VC实现洪水攻击程序
    WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml
  • 原文地址:https://www.cnblogs.com/byrhuangqiang/p/4636165.html
Copyright © 2011-2022 走看看