zoukankan      html  css  js  c++  java
  • LeetCode 43. Multiply Strings

    原题链接在这里:https://leetcode.com/problems/multiply-strings/

    题目:

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

    Example 1:

    Input: num1 = "2", num2 = "3"
    Output: "6"

    Example 2:

    Input: num1 = "123", num2 = "456"
    Output: "56088"

    Note:

    1. The length of both num1 and num2 is < 110.
    2. Both num1 and num2 contain only digits 0-9.
    3. Both num1 and num2 do not contain any leading zero, except the number 0 itself.
    4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

    题解:

    Method 1:通过这道题, 学到了BigInteger的用法, 他的constructor 可以直接从string建立BigInteger, 但要注意它的乘法API是bi1.multiply(bi2).

    若是中间需要考虑溢出,还有bi1.intValue(), bi1.longValue()等API.

    Method 2:若num1.length() = m, num2.length() = n, 那么结果的长度为m+n-1(没有进位),或者是m+n(有进位)。

    以289*758为例:

    image

    生成数组d来储存成绩和结果,例子中的14,66,119,109,72行,然后取余进位.

    为了方便起见,把原string reverse.

    Note: corner case "0" * "1234", if either string starts with 0, return "0". Otherwise it would return "0000".

    Time Complexity: O(len1*len2).

    Space: O(len1+len2).

    AC Java:

     1 import java.math.*;
     2 public class Solution {
     3     public String multiply(String num1, String num2) {
     4         /*Method 1
     5         if(num1 == null || num2 == null || num1.length() ==0 || num2.length() == 0)
     6             return "";
     7         BigInteger bi1 = new BigInteger(num1);
     8         BigInteger bi2 = new BigInteger(num2);
     9         
    10         BigInteger res = bi1.multiply(bi2);
    11         return res.toString();
    12         */
    13         
    14         //Method 2
    15         if(num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0){
    16             return "";
    17         }
    18         if(num1.charAt(0) == '0' || num2.charAt(0) == '0'){
    19             return "0";
    20         }
    21         num1 = new StringBuilder(num1).reverse().toString();
    22         num2 = new StringBuilder(num2).reverse().toString();
    23         int len1 = num1.length();
    24         int len2 = num2.length();
    25         
    26         int [] d = new int[len1 + len2];
    27         for(int i = 0; i<len1; i++){
    28             int a = num1.charAt(i) - '0';
    29             for(int j = 0; j<len2; j++){
    30                 d[i+j] += a * (num2.charAt(j)-'0');
    31             }
    32         }
    33         
    34         int cur = 0;
    35         int carry = 0;
    36         StringBuilder sb = new StringBuilder();
    37         for(int i = 0; i<d.length; i++){
    38             cur = (d[i]+carry)%10;
    39             carry = (d[i]+carry)/10;
    40             sb.insert(0,cur);
    41         }
    42         if(sb.charAt(0) == '0'){
    43             sb.deleteCharAt(0);
    44         }
    45         return sb.toString();
    46     }
    47 }

    类似Add Strings.

  • 相关阅读:
    (dp)LeetCode Weekly Contest 34 -Non-negative Integers without Consecutive Ones
    (后缀数组)poj 3581 Sequence
    (最小生成树)Codeforces 76 A Gift
    (最小生成树)Codeforces Educational Codeforces Round 9 Magic Matrix
    (AC自动机)UVALive
    (trie)BUAAOJ 371
    CCF 201312-3 最大的矩形
    http错误代码含义
    数据结构-5-二叉树的实现以及递归遍历的实现
    数据结构-3.4-栈与队列
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4825033.html
Copyright © 2011-2022 走看看